diff options
| author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-29 23:51:53 +0000 |
|---|---|---|
| committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-29 23:51:53 +0000 |
| commit | c03e220cf30d9f4cd8a1cb3d8ebb2d779862c0bc (patch) | |
| tree | 01f8cec9d71a5e9b486db5043413552604995064 /file.c | |
| parent | f2c87d53953fad3c674c72081e5f3b86391d4dbd (diff) | |
* file.c (file_expand_path): home directory must be absolute.
[ruby-core:31537]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@28796 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
| -rw-r--r-- | file.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -2512,6 +2512,7 @@ file_expand_path(fname, dname, result) tainted = OBJ_TAINTED(fname); if (s[0] == '~') { + long userlen = 0; if (isdirsep(s[1]) || s[1] == '\0') { const char *dir = getenv("HOME"); @@ -2539,9 +2540,10 @@ file_expand_path(fname, dname, result) s++; #endif s = nextdirsep(b = s); - BUFCHECK(bdiff + (s-b) >= buflen); - memcpy(p, b, s-b); - p += s-b; + userlen = s - b; + BUFCHECK(bdiff + userlen >= buflen); + memcpy(p, b, userlen); + p += userlen; *p = '\0'; #ifdef HAVE_PWD_H pwPtr = getpwnam(buf); @@ -2558,6 +2560,14 @@ file_expand_path(fname, dname, result) rb_raise(rb_eArgError, "can't find user %s", buf); #endif } + if (!is_absolute_path(RSTRING_PTR(result))) { + if (userlen) { + rb_raise(rb_eArgError, "non-absolute home of %.*s", userlen, s); + } + else { + rb_raise(rb_eArgError, "non-absolute home"); + } + } } #ifdef DOSISH_DRIVE_LETTER /* skip drive letter */ |
