1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* file.c (file_expand_path): home directory must be absolute.

[ruby-core:31537]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28796 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-07-29 23:51:53 +00:00
parent a99de84663
commit 6d56e80ad1
3 changed files with 31 additions and 4 deletions

View file

@ -1,3 +1,8 @@
Fri Jul 30 08:51:51 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* file.c (file_expand_path): home directory must be absolute.
[ruby-core:31537]
Fri Jul 30 08:33:20 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Jul 30 08:33:20 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* file.c (file_expand_path): should check if could find user. * file.c (file_expand_path): should check if could find user.

18
file.c
View file

@ -2851,6 +2851,7 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
tainted = OBJ_TAINTED(fname); tainted = OBJ_TAINTED(fname);
if (s[0] == '~' && abs_mode == 0) { /* execute only if NOT absolute_path() */ if (s[0] == '~' && abs_mode == 0) { /* execute only if NOT absolute_path() */
long userlen = 0;
tainted = 1; tainted = 1;
if (isdirsep(s[1]) || s[1] == '\0') { if (isdirsep(s[1]) || s[1] == '\0') {
buf = 0; buf = 0;
@ -2859,15 +2860,24 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
} }
else { else {
s = nextdirsep(b = s); s = nextdirsep(b = s);
BUFCHECK(bdiff + (s-b) >= buflen); userlen = s - b;
memcpy(p, b, s-b); BUFCHECK(bdiff + userlen >= buflen);
rb_str_set_len(result, s-b); memcpy(p, b, userlen);
rb_str_set_len(result, userlen);
buf = p + 1; buf = p + 1;
p += s-b; p += userlen;
} }
if (NIL_P(rb_home_dir(buf, result))) { if (NIL_P(rb_home_dir(buf, result))) {
rb_raise(rb_eArgError, "can't find user %s", buf); rb_raise(rb_eArgError, "can't find user %s", buf);
} }
if (!rb_is_absolute_path(RSTRING_PTR(result))) {
if (userlen) {
rb_raise(rb_eArgError, "non-absolute home of %.*s", (int)userlen, b);
}
else {
rb_raise(rb_eArgError, "non-absolute home");
}
}
BUFINIT(); BUFINIT();
p = pend; p = pend;
} }

View file

@ -397,6 +397,18 @@ class TestFileExhaustive < Test::Unit::TestCase
assert_kind_of(String, File.expand_path("~")) assert_kind_of(String, File.expand_path("~"))
assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha") } assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha") }
assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha", "/") } assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha", "/") }
begin
bug3630 = '[ruby-core:31537]'
home = ENV["HOME"]
ENV["HOME"] = nil
assert_raise(ArgumentError) { File.expand_path("~") }
ENV["HOME"] = "~"
assert_raise(ArgumentError, bug3630) { File.expand_path("~") }
ENV["HOME"] = "."
assert_raise(ArgumentError, bug3630) { File.expand_path("~") }
ensure
ENV["HOME"] = home
end
assert_incompatible_encoding {|d| File.expand_path(d)} assert_incompatible_encoding {|d| File.expand_path(d)}
end end