From dee96209bfbb957538c7adeb01a65f3830749179 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 6 Dec 1999 09:04:03 +0000 Subject: 19991206 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 39 ++++++++++++++++++++++++ bignum.c | 13 ++++---- configure | 4 +-- configure.in | 2 +- eval.c | 9 ++++-- ext/tk/lib/tk.rb | 2 ++ ext/tk/lib/tkcanvas.rb | 1 + file.c | 80 +++++++++++++++++++++++++++----------------------- gc.c | 4 +-- hash.c | 2 +- intern.h | 2 +- lib/mkmf.rb | 2 +- numeric.c | 12 ++++---- object.c | 1 + process.c | 1 + random.c | 11 ++++--- range.c | 1 + regex.c | 37 +++++++++++++++++++++-- regex.h | 1 + ruby.c | 19 +++++++----- sprintf.c | 4 +++ string.c | 8 +++-- version.h | 4 +-- 23 files changed, 177 insertions(+), 82 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb9a695a89..8b5efcbea5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,42 @@ +Mon Dec 6 15:55:30 1999 EGUCHI Osamu + + * numeric.c (fix_rshift): Fix -1 >> 32 returned 0. (-1 is true) + + * numeric.c (fix_rshift): Fix 1 >> -1 returned 0. (2 is true) + +Mon Dec 6 11:47:23 1999 Yukihiro Matsumoto + + * sprintf.c (rb_f_sprintf): formatted string must be tainted if + any of parameters is tainted. + + * file.c (rb_file_s_expand_path): expanded file path need not to + be tainted always. + +Sun Dec 5 20:25:29 1999 Katsuhiro Ueno + + * eval.c (Init_Proc): simple typo. + + * gc.c (add_heap): sizeof(RVALUE*), not sizeof(RVALUE). + +Sat Dec 4 01:40:22 1999 Yukihiro Matsumoto + + * regex.c (re_search): adjust startpos for multibyte match unless + the first pattern is forced byte match. + + * bignum.c (rb_big_rand): should not use rand/random where drand48 + may be available. RANDOM_NUMBER should be provided from outside. + +Fri Dec 3 09:54:59 1999 Yukihiro Matsumoto + + * ruby.c (moreswitches): there may be trailing garbage at #! + line. + + * eval.c (rb_f_require): should check require 'feature.o' too. + +Thu Dec 2 11:58:15 1999 Koji Arai + + * eval.c (rb_thread_loading): should maintain loading_tbl. + Thu Dec 2 10:21:43 1999 Yukihiro Matsumoto * eval.c (rb_thread_loading_done): wrong parameter to st_delete(). diff --git a/bignum.c b/bignum.c index 05df7c1683..828e0cb9aa 100644 --- a/bignum.c +++ b/bignum.c @@ -1255,20 +1255,17 @@ rb_big_abs(x) */ VALUE -rb_big_rand(max) +rb_big_rand(max, rand) VALUE max; + double rand; { - struct RBignum *v; + VALUE v; long len; len = RBIGNUM(max)->len; - v = RBIGNUM(bignew(len,1)); + v = bignew(len,1); while (len--) { -#ifdef HAVE_RANDOM - BDIGITS(v)[len] = random(); -#else - BDIGITS(v)[len] = rand(); -#endif + BDIGITS(v)[len] = ((USHORT)~0) * rand; } return rb_big_mod((VALUE)v, max); diff --git a/configure b/configure index 3de072e6b1..fc3575ea03 100644 --- a/configure +++ b/configure @@ -3641,7 +3641,7 @@ else int main() { /* Ultrix mips cc rejects this. */ -typedef int charset[2]; const charset x; +typedef int charset[2]; const charset x = {0,0}; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; @@ -3783,7 +3783,7 @@ else int main() { - if (-1==(-1>>1)) + if (-1==(-1>>(unsigned)1)) return 0; return 1; } diff --git a/configure.in b/configure.in index 415aae9d23..d046257ae6 100644 --- a/configure.in +++ b/configure.in @@ -260,7 +260,7 @@ AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign, int main() { - if (-1==(-1>>1)) + if (-1==(-1>>(unsigned)1)) return 0; return 1; } diff --git a/eval.c b/eval.c index 00006aeff5..32d0155b15 100644 --- a/eval.c +++ b/eval.c @@ -3303,6 +3303,7 @@ static VALUE rb_f_loop() { for (;;) { rb_yield_0(Qnil, 0, 0, Qfalse); } + return Qnil; /* dummy */ } static VALUE @@ -4861,6 +4862,7 @@ rb_f_require(obj, fname) ext = strrchr(buf, '.'); strcpy(ext, DLEXT); file = feature = buf; + if (rb_provided(feature)) return Qfalse; } file = find_file(file); if (file) goto load_dyna; @@ -6020,7 +6022,7 @@ Init_Proc() rb_define_global_function("lambda", rb_f_lambda, 0); rb_define_global_function("binding", rb_f_binding, 0); rb_cBinding = rb_define_class("Binding", rb_cObject); - rb_undef_method(CLASS_OF(rb_cMethod), "new"); + rb_undef_method(CLASS_OF(rb_cBinding), "new"); rb_define_method(rb_cBinding, "clone", bind_clone, 0); rb_cMethod = rb_define_class("Method", rb_cObject); @@ -7361,10 +7363,13 @@ static int rb_thread_loading(feature) const char *feature; { - if (!rb_provided(feature)) return Qfalse; /* need to load */ if (!loading_tbl) { loading_tbl = st_init_strtable(); } + if (!rb_provided(feature)) { + st_insert(loading_tbl, feature, 0); + return Qfalse; /* need to load */ + } while (st_lookup(loading_tbl, feature, 0)) { CHECK_INTS; rb_thread_schedule(); diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index f831dbc78a..c933f9db8b 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -2131,6 +2131,8 @@ class TkTextWinptr); } else { + tainted = 1; #ifdef HAVE_GETCWD getcwd(buf, MAXPATHLEN); #else @@ -1286,7 +1290,9 @@ rb_file_s_expand_path(argc, argv) if (p == buf || !isdirsep(*p)) p++; *p = '\0'; - return rb_tainted_str_new2(buf); + fname = rb_str_new2(buf); + if (tainted) OBJ_TAINT(fname); + return fname; } static int @@ -1758,18 +1764,18 @@ static VALUE rb_stat_r(obj) VALUE obj; { - mode_t mode = get_stat(obj)->st_mode; + struct stat *st = get_stat(obj); #ifdef S_IRUSR if (rb_stat_owned(obj)) - return mode & S_IRUSR ? Qtrue : Qfalse; + return st->st_mode & S_IRUSR ? Qtrue : Qfalse; #endif #ifdef S_IRGRP if (rb_stat_grpowned(obj)) - return mode & S_IRGRP ? Qtrue : Qfalse; + return st->st_mode & S_IRGRP ? Qtrue : Qfalse; #endif #ifdef S_IROTH - if (!(mode & S_IROTH)) return Qfalse; + if (!(st->st_mode & S_IROTH)) return Qfalse; #endif return Qtrue; } @@ -1778,18 +1784,18 @@ static VALUE rb_stat_R(obj) VALUE obj; { - mode_t mode = get_stat(obj)->st_mode; + struct stat *st = get_stat(obj); #ifdef S_IRUSR if (rb_stat_rowned(obj)) - return mode & S_IRUSR ? Qtrue : Qfalse; + return st->st_mode & S_IRUSR ? Qtrue : Qfalse; #endif #ifdef S_IRGRP if (group_member(get_stat(obj)->st_gid)) - return mode & S_IRGRP ? Qtrue : Qfalse; + return st->st_mode & S_IRGRP ? Qtrue : Qfalse; #endif #ifdef S_IROTH - if (!(mode & S_IROTH)) return Qfalse; + if (!(st->st_mode & S_IROTH)) return Qfalse; #endif return Qtrue; } @@ -1798,18 +1804,18 @@ static VALUE rb_stat_w(obj) VALUE obj; { - mode_t mode = get_stat(obj)->st_mode; + struct stat *st = get_stat(obj); -#ifdef S_IRUSR +#ifdef S_IWUSR if (rb_stat_owned(obj)) - return mode & S_IWUSR ? Qtrue : Qfalse; + return st->st_mode & S_IWUSR ? Qtrue : Qfalse; #endif -#ifdef S_IRGRP +#ifdef S_IWGRP if (rb_stat_grpowned(obj)) - return mode & S_IWGRP ? Qtrue : Qfalse; + return st->st_mode & S_IWGRP ? Qtrue : Qfalse; #endif -#ifdef S_IROTH - if (!(mode & S_IWOTH)) return Qfalse; +#ifdef S_IWOTH + if (!(st->st_mode & S_IWOTH)) return Qfalse; #endif return Qtrue; } @@ -1818,18 +1824,18 @@ static VALUE rb_stat_W(obj) VALUE obj; { - mode_t mode = get_stat(obj)->st_mode; + struct stat *st = get_stat(obj); -#ifdef S_IRUSR +#ifdef S_IWUSR if (rb_stat_rowned(obj)) - return mode & S_IWUSR ? Qtrue : Qfalse; + return st->st_mode & S_IWUSR ? Qtrue : Qfalse; #endif -#ifdef S_IRGRP +#ifdef S_IWGRP if (group_member(get_stat(obj)->st_gid)) - return mode & S_IWGRP ? Qtrue : Qfalse; + return st->st_mode & S_IWGRP ? Qtrue : Qfalse; #endif -#ifdef S_IROTH - if (!(mode & S_IWOTH)) return Qfalse; +#ifdef S_IWOTH + if (!(st->st_mode & S_IWOTH)) return Qfalse; #endif return Qtrue; } @@ -1838,18 +1844,18 @@ static VALUE rb_stat_x(obj) VALUE obj; { - mode_t mode = get_stat(obj)->st_mode; + struct stat *st = get_stat(obj); -#ifdef S_IRUSR +#ifdef S_IXUSR if (rb_stat_owned(obj)) - return mode & S_IXUSR ? Qtrue : Qfalse; + return st->st_mode & S_IXUSR ? Qtrue : Qfalse; #endif -#ifdef S_IRGRP +#ifdef S_IXGRP if (rb_stat_grpowned(obj)) - return mode & S_IXGRP ? Qtrue : Qfalse; + return st->st_mode & S_IXGRP ? Qtrue : Qfalse; #endif -#ifdef S_IROTH - if (!(mode & S_IXOTH)) return Qfalse; +#ifdef S_IXOTH + if (!(st->st_mode & S_IXOTH)) return Qfalse; #endif return Qtrue; } @@ -1858,18 +1864,18 @@ static VALUE rb_stat_X(obj) VALUE obj; { - mode_t mode = get_stat(obj)->st_mode; + struct stat *st = get_stat(obj); -#ifdef S_IRUSR +#ifdef S_IXUSR if (rb_stat_rowned(obj)) - return mode & S_IXUSR ? Qtrue : Qfalse; + return st->st_mode & S_IXUSR ? Qtrue : Qfalse; #endif -#ifdef S_IRGRP +#ifdef S_IXGRP if (group_member(get_stat(obj)->st_gid)) - return mode & S_IXGRP ? Qtrue : Qfalse; + return st->st_mode & S_IXGRP ? Qtrue : Qfalse; #endif -#ifdef S_IROTH - if (!(mode & S_IXOTH)) return Qfalse; +#ifdef S_IXOTH + if (!(st->st_mode & S_IXOTH)) return Qfalse; #endif return Qtrue; } diff --git a/gc.c b/gc.c index 0398b6b946..6122724175 100644 --- a/gc.c +++ b/gc.c @@ -242,8 +242,8 @@ add_heap() /* Realloc heaps */ heaps_length += HEAPS_INCREMENT; heaps = (heaps_used>0)? - (RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE)): - (RVALUE**)malloc(heaps_length*sizeof(RVALUE)); + (RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE*)): + (RVALUE**)malloc(heaps_length*sizeof(RVALUE*)); if (heaps == 0) rb_fatal("can't alloc memory"); } diff --git a/hash.c b/hash.c index 10e9f86346..fed5b9e7ec 100644 --- a/hash.c +++ b/hash.c @@ -895,7 +895,7 @@ env_delete(obj, name) if (strcmp(nam, "PATH") == 0 && !OBJ_TAINTED(name)) { path_tainted = 0; } - return rb_str_new2(val); + return rb_tainted_str_new2(val); } return Qnil; } diff --git a/intern.h b/intern.h index 963571360f..95f3ad517f 100644 --- a/intern.h +++ b/intern.h @@ -57,7 +57,7 @@ VALUE rb_big_and _((VALUE, VALUE)); VALUE rb_big_or _((VALUE, VALUE)); VALUE rb_big_xor _((VALUE, VALUE)); VALUE rb_big_lshift _((VALUE, VALUE)); -VALUE rb_big_rand _((VALUE)); +VALUE rb_big_rand _((VALUE, double)); /* class.c */ VALUE rb_class_new _((VALUE)); VALUE rb_singleton_class_new _((VALUE)); diff --git a/lib/mkmf.rb b/lib/mkmf.rb index 5df77bd3ab..e77c45871e 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -4,7 +4,7 @@ require 'rbconfig' require 'find' -include Config +CONFIG = Config::MAKEFILE_CONFIG SRC_EXT = ["c", "cc", "m", "cxx", "cpp", "C"] diff --git a/numeric.c b/numeric.c index d1c016e708..77b52ffec9 100644 --- a/numeric.c +++ b/numeric.c @@ -63,6 +63,7 @@ coerce_rescue(x) STR2CSTR(rb_inspect(x[1])): rb_class2name(CLASS_OF(x[1])), rb_class2name(CLASS_OF(x[0]))); + return Qnil; /* dummy */ } static void @@ -657,6 +658,7 @@ fail_to_integer(val) { rb_raise(rb_eTypeError, "failed to convert %s into Integer", rb_class2name(CLASS_OF(val))); + return Qnil; /* dummy */ } long @@ -1169,12 +1171,10 @@ fix_rshift(x, y) long i, val; i = NUM2LONG(y); - if (i < sizeof(long) * 8) { - val = RSHIFT(FIX2LONG(x), i); - return INT2FIX(val); - } - - return INT2FIX(0); + if (i < 0) + return fix_lshift(x, INT2FIX(-i)); + val = RSHIFT(FIX2LONG(x), i); + return INT2FIX(val); } static VALUE diff --git a/object.c b/object.c index 6314974e3f..be070a9ac2 100644 --- a/object.c +++ b/object.c @@ -598,6 +598,7 @@ static VALUE rb_class_s_inherited() { rb_raise(rb_eTypeError, "can't make subclass of Class"); + return Qnil; /* dummy */ } static VALUE diff --git a/process.c b/process.c index 211445b88d..cecdaa6770 100644 --- a/process.c +++ b/process.c @@ -505,6 +505,7 @@ rb_f_exec(argc, argv) proc_exec_n(argc, argv, prog); } rb_sys_fail(RSTRING(argv[0])->ptr); + return Qnil; /* dummy */ } static VALUE diff --git a/random.c b/random.c index fbfa94e4e9..67c752d0f7 100644 --- a/random.c +++ b/random.c @@ -126,13 +126,12 @@ rb_f_rand(obj, vmax) long val, max; switch (TYPE(vmax)) { - case T_BIGNUM: - return rb_big_rand(vmax); - case T_FLOAT: - if (RFLOAT(vmax)->value > LONG_MAX || RFLOAT(vmax)->value < LONG_MIN) - return rb_big_rand(rb_dbl2big(RFLOAT(vmax)->value)); - break; + if (RFLOAT(vmax)->value <= LONG_MAX && RFLOAT(vmax)->value >= LONG_MIN) + break; + /* fall through */ + case T_BIGNUM: + return rb_big_rand(vmax, RANDOM_NUMBER); } max = NUM2LONG(vmax); diff --git a/range.c b/range.c index b1925e9929..f521c1405d 100644 --- a/range.c +++ b/range.c @@ -30,6 +30,7 @@ static VALUE range_failed() { rb_raise(rb_eArgError, "bad value for range"); + return Qnil; /* dummy */ } static VALUE diff --git a/regex.c b/regex.c index f77d635a0a..834d97b574 100644 --- a/regex.c +++ b/regex.c @@ -396,6 +396,7 @@ re_set_syntax(syntax) long syntax; { /* obsolete */ + return 0; } @@ -2272,9 +2273,9 @@ re_compile_pattern(pattern, size, bufp) } if (!(bufp->options & RE_OPTIMIZE_NO_BM)) { bufp->must_skip = (int *) xmalloc((1 << BYTEWIDTH)*sizeof(int)); - bm_init_skip(bufp->must_skip, bufp->must+1, + bm_init_skip(bufp->must_skip, (unsigned char*)bufp->must+1, (unsigned char)bufp->must[0], - MAY_TRANSLATE()?translate:0); + (unsigned char*)(MAY_TRANSLATE()?translate:0)); } } @@ -2626,6 +2627,7 @@ re_compile_fastmap(bufp) fastmap[translate[p[2]]] = 2; else fastmap[p[2]] = 2; + bufp->options |= RE_OPTIMIZE_BMATCH; } else if (TRANSLATE_P()) fastmap[translate[p[1]]] = 1; @@ -2828,8 +2830,10 @@ re_compile_fastmap(bufp) while (beg <= end) { /* NOTE: Charset for multi-byte chars might contain single-byte chars. We must reject them. */ - if (c < 0x100) + if (c < 0x100) { fastmap[beg] = 2; + bufp->options |= RE_OPTIMIZE_BMATCH; + } else if (ismbchar(beg)) fastmap[beg] = 1; beg++; @@ -2950,6 +2954,33 @@ re_search(bufp, string, size, startpos, range, regs) re_compile_fastmap(bufp); } + /* Adjust startpos for mbc string */ + if (current_mbctype && startpos>0 && !(bufp->options&RE_OPTIMIZE_BMATCH)) { + int i = 0; + + if (range > 0) { + while (iused>0) { diff --git a/regex.h b/regex.h index 8ce80d472b..0d91273241 100644 --- a/regex.h +++ b/regex.h @@ -77,6 +77,7 @@ #define RE_OPTIMIZE_ANCHOR (RE_MAY_IGNORECASE<<1) #define RE_OPTIMIZE_EXACTN (RE_OPTIMIZE_ANCHOR<<1) #define RE_OPTIMIZE_NO_BM (RE_OPTIMIZE_EXACTN<<1) +#define RE_OPTIMIZE_BMATCH (RE_OPTIMIZE_NO_BM<<1) /* For multi-byte char support */ #define MBCTYPE_ASCII 0 diff --git a/ruby.c b/ruby.c index 19879859fc..b5c632b4e3 100644 --- a/ruby.c +++ b/ruby.c @@ -289,6 +289,7 @@ process_sflag() rb_ary_shift(rb_argv); } } + sflag = 0; } static void proc_options _((int argc, char **argv)); @@ -303,8 +304,10 @@ moreswitches(s) argc = 2; argv[0] = argv[2] = 0; while (*s && !ISSPACE(*s)) s++; - argv[1] = ALLOCA_N(char, s - p + 2); - sprintf(argv[1], "-%s", p); + argv[1] = ALLOCA_N(char, s-p+2); + argv[1][0] = '-'; + strncpy(argv[1]+1, p, s-p); + argv[1][s-p+1] = '\0'; proc_options(argc, argv); while (*s && ISSPACE(*s)) s++; @@ -450,13 +453,16 @@ proc_options(argc, argv) break; case 'F': - rb_fs = rb_str_new2(s+1); + if (*++s) { + rb_fs = rb_str_new2(s); + } break; case 'K': - s++; - rb_set_kcode(s); - s++; + if (*++s) { + rb_set_kcode(s); + s++; + } goto reswitch; case 'T': @@ -634,7 +640,6 @@ proc_options(argc, argv) } process_sflag(); - sflag = 0; xflag = 0; } diff --git a/sprintf.c b/sprintf.c index 5bfd403181..5badb61f71 100644 --- a/sprintf.c +++ b/sprintf.c @@ -172,10 +172,12 @@ rb_f_sprintf(argc, argv) int width, prec, flags = FNONE; int nextarg = 0; + int tainted = 0; VALUE tmp; VALUE str; fmt = GETARG(); + if (OBJ_TAINTED(fmt)) tainted = 1; p = str2cstr(fmt, &blen); end = p + blen; blen = 0; @@ -318,6 +320,7 @@ rb_f_sprintf(argc, argv) int len; str = rb_obj_as_string(arg); + if (OBJ_TAINTED(str)) tainted = 1; len = RSTRING(str)->len; if (flags&FPREC) { if (prec < len) { @@ -651,6 +654,7 @@ rb_f_sprintf(argc, argv) result = rb_str_new(buf, blen); free(buf); + if (tainted) OBJ_TAINT(result); return result; } diff --git a/string.c b/string.c index 7b8c558c11..ee22f202e4 100644 --- a/string.c +++ b/string.c @@ -128,7 +128,7 @@ rb_str_to_str(str) } static void -rb_str_assign(str, str2) +rb_str_become(str, str2) VALUE str, str2; { if (str == str2) return; @@ -422,7 +422,9 @@ rb_str_concat(str1, str2) } } if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2); - return rb_str_cat(str1, RSTRING(str2)->ptr, RSTRING(str2)->len); + str1 = rb_str_cat(str1, RSTRING(str2)->ptr, RSTRING(str2)->len); + if (OBJ_TAINTED(str2)) OBJ_TAINT(str1); + return str1; } int @@ -746,7 +748,7 @@ rb_str_succ_bang(str) VALUE str; { rb_str_modify(str); - rb_str_assign(str, rb_str_succ(str)); + rb_str_become(str, rb_str_succ(str)); return str; } diff --git a/version.h b/version.h index 6baa265780..508325f620 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.5.0" -#define RUBY_RELEASE_DATE "1999-12-02" +#define RUBY_RELEASE_DATE "1999-12-06" #define RUBY_VERSION_CODE 150 -#define RUBY_RELEASE_CODE 19991202 +#define RUBY_RELEASE_CODE 19991206 -- cgit v1.2.3