diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-07-27 09:12:12 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-07-27 09:12:12 +0000 |
commit | 0abedcd80770841475006342c96d348d78f91ab8 (patch) | |
tree | 289c8c48ee23c65aeac5a2983433c47cdee08f41 | |
parent | 980f8164797ce17f77be3e1ad9b5e4e96fdab4a3 (diff) |
* eval.c (rb_provided): extension should be guessed using
rb_find_file_noext().
* eval.c (rb_f_require): should call rb_feature_p() after
extension completion.
* eval.c (rb_eval): add CHECK_INTS before next, redo, retry to
avoid potential uninterruptable infinite loop.
* file.c (rb_file_s_expand_path): use CharNext() to expand.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1653 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | eval.c | 18 | ||||
-rw-r--r-- | file.c | 38 |
3 files changed, 69 insertions, 15 deletions
@@ -1,12 +1,40 @@ +Fri Jul 27 18:07:27 2001 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (rb_provided): extension should be guessed using + rb_find_file_noext(). + + * eval.c (rb_f_require): should call rb_feature_p() after + extension completion. + +Fri Jul 27 16:25:52 2001 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (rb_eval): add CHECK_INTS before next, redo, retry to + avoid potential uninterruptable infinite loop. + Thu Jul 26 11:27:12 2001 WATANABE Hirofumi <eban@ruby-lang.org> * file.c (rb_find_file_noext, rb_find_file): fix tilde expansion problem. +Wed Jul 25 17:54:20 2001 Yukihiro Matsumoto <matz@ruby-lang.org> + + * file.c (rb_file_s_expand_path): use CharNext() to expand. + Wed Jul 25 17:16:26 2001 Akinori MUSHA <knu@iDaemons.org> * intern.h: add some missing function prototypes. +Wed Jul 25 15:50:05 2001 Guy Decoux <decoux@moulon.inra.fr> + + * file.c (rb_file_s_expand_path): should not expand "." and ".." + not following dirsep. + +Wed Jul 25 12:15:32 2001 WATANABE Hirofumi <eban@ruby-lang.org> + + * file.c (rb_find_file_noext): should update f by expanded path. + + * file.c (rb_find_file): ditto. + Tue Jul 24 23:10:47 2001 Nobuyoshi.Nakada <nobu.nakada@nifty.ne.jp> * file.c (strrdirsep): multi-byte pathname and DOSish separater @@ -2398,6 +2398,7 @@ rb_eval(self, n) break; case NODE_NEXT: + CHECK_INTS; if (node->nd_stts) { return_value(avalue_to_svalue(rb_eval(self, node->nd_stts))); } @@ -2408,10 +2409,12 @@ rb_eval(self, n) break; case NODE_REDO: + CHECK_INTS; JUMP_TAG(TAG_REDO); break; case NODE_RETRY: + CHECK_INTS; JUMP_TAG(TAG_RETRY); break; @@ -5385,7 +5388,14 @@ int rb_provided(feature) const char *feature; { - return rb_feature_p(feature, Qfalse); + VALUE f = rb_str_new2(feature); + + if (strrchr(feature, '.') == 0) { + if (rb_find_file_noext(&f) == 0) { + return Qfalse; + } + } + return rb_feature_p(RSTRING(f)->ptr, Qfalse); } static void @@ -5413,8 +5423,6 @@ rb_f_require(obj, fname) volatile int safe = ruby_safe_level; SafeStringValue(fname); - if (rb_feature_p(RSTRING(fname)->ptr, Qtrue)) - return Qfalse; ext = strrchr(RSTRING(fname)->ptr, '.'); if (ext) { if (strcmp(".rb", ext) == 0) { @@ -5480,6 +5488,8 @@ rb_f_require(obj, fname) rb_raise(rb_eLoadError, "No such file to load -- %s", RSTRING(fname)->ptr); load_dyna: + if (rb_feature_p(RSTRING(feature)->ptr, Qfalse)) + return Qfalse; rb_provide_feature(feature); { int volatile old_vmode = scope_vmode; @@ -5500,6 +5510,8 @@ rb_f_require(obj, fname) return Qtrue; load_rb: + if (rb_feature_p(RSTRING(feature)->ptr, Qtrue)) + return Qfalse; ruby_safe_level = 0; rb_provide_feature(feature); /* loading ruby library should be serialized. */ @@ -1332,7 +1332,7 @@ rb_file_s_expand_path(argc, argv) VALUE *argv; { VALUE fname, dname; - char *s, *p; + char *s, *p, *sbeg, *b; char buf[MAXPATHLEN+2]; char *bend = buf + sizeof(buf) - 2; int tainted; @@ -1340,7 +1340,7 @@ rb_file_s_expand_path(argc, argv) rb_scan_args(argc, argv, "11", &fname, &dname); tainted = OBJ_TAINTED(fname); - s = StringValuePtr(fname); + s = sbeg = StringValuePtr(fname); p = buf; if (s[0] == '~') { if (isdirsep(s[1]) || s[1] == '\0') { @@ -1360,10 +1360,13 @@ rb_file_s_expand_path(argc, argv) struct passwd *pwPtr; s++; #endif + b = s; while (*s && !isdirsep(*s)) { - *p++ = *s++; - if (p >= bend) goto toolong; + s = CharNext(s); } + if (p + (s-b) >= bend) goto toolong; + memcpy(p, b, s-b); + p += s-b; *p = '\0'; #ifdef HAVE_PWD_H pwPtr = getpwnam(buf); @@ -1381,10 +1384,13 @@ rb_file_s_expand_path(argc, argv) #if defined DOSISH /* skip drive letter */ else if (ISALPHA(s[0]) && s[1] == ':' && isdirsep(s[2])) { + b = s; while (*s && !isdirsep(*s)) { - *p++ = *s++; - if (p >= bend) goto toolong; + s = CharNext(s); } + if (p + (s-b) >= bend) goto toolong; + memcpy(p, b, s-b); + p += s-b; } #endif else if (!isdirsep(*s)) { @@ -1411,10 +1417,10 @@ rb_file_s_expand_path(argc, argv) } *p = '/'; - for ( ; *s; s++) { + while (*s) { switch (*s) { case '.': - if (*(s+1)) { + if (*(s+1) && (s == sbeg || isdirsep(*(s - 1)))) { switch (*++s) { case '.': if (*(s+1) == '\0' || isdirsep(*(s+1))) { @@ -1440,6 +1446,9 @@ rb_file_s_expand_path(argc, argv) default: *++p = '.'; *++p = *s; break; } + } + else { + *++p = '.'; } break; case '/': @@ -1448,9 +1457,14 @@ rb_file_s_expand_path(argc, argv) #endif if (!isdirsep(*p)) *++p = '/'; break; default: - *++p = *s; - if (p >= bend) goto toolong; + b = s; + s = CharNext(s); + p = CharNext(p); + if (p + (s-b) >= bend) goto toolong; + memcpy(p, b, s-b); + continue; } + s = CharNext(s); } /* Place a \0 at end. If path ends with a "/", delete it */ @@ -2278,7 +2292,7 @@ rb_find_file_noext(filep) if (rb_safe_level() >= 2 && OBJ_TAINTED(fname)) { rb_raise(rb_eSecurityError, "loading from unsafe file %s", f); } - f = STR2CSTR(fname); + f = StringValuePtr(fname); *filep = fname; } @@ -2329,7 +2343,7 @@ rb_find_file(path) if (rb_safe_level() >= 2 && OBJ_TAINTED(path)) { rb_raise(rb_eSecurityError, "loading from unsafe file %s", f); } - f = STR2CSTR(path); + f = StringValuePtr(path); } #if defined(__MACOS__) || defined(riscos) |