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

* file.c (rb_find_file): load must be done from an abolute path if

$SAFE >= 4.

* re.c (rb_reg_s_quote): quote whitespaces for /x cases.

* eval.c (rb_thread_cleanup): should not terminate main_thread by
  Fatal error.

* regex.c (is_in_list): need to not exclude NUL and NEWLINE.

* re.c (rb_reg_expr_str): wrong backslash escapement.

* re.c (rb_reg_expr_str): do not escape embedded space
  characters.

* eval.c (rb_thread_cleanup): current thread may be THREAD_STOPPED,
  for example when terminated from signal handler.

* re.c (rb_reg_expr_str): should treat backslash specially in
  escaping.

* bignum.c (rb_big_eq): check `y == x' if y is neither Fixnum,
  Bignum, nor Float.

* pack.c (pack_unpack): should treat 'U' in character unit, not in
  byte unit.

* marshal.c (w_uclass): should check based on rb_obj_class(), not
  CLASS_OF().

* io.c (io_write): check error if written data is less than
  specified size to detect EPIPE.

* eval.c (assign): ruby_verbose should be surrounded by RTEST().

* object.c (rb_str2cstr): ditto.

* parse.y (void_expr): ditto.

* parse.y (void_stmts): ditto.

* variable.c (rb_ivar_get): ditto.

* variable.c (rb_cvar_set): ditto.

* variable.c (rb_cvar_get): ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@2419 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-05-01 09:38:01 +00:00
parent 11a1286fe1
commit 8145a071a9
14 changed files with 146 additions and 75 deletions

View file

@ -1,7 +1,16 @@
Mon Apr 29 18:46:42 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* file.c (rb_find_file): load must be done from an abolute path if
$SAFE >= 4.
Sun Apr 28 17:01:56 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* win32/win32.c (insert): fix prototype for ANSI C.
Fri Apr 26 13:41:00 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* re.c (rb_reg_s_quote): quote whitespaces for /x cases.
Wed Apr 24 14:21:41 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* configure.in: set size of the initial stack from
@ -22,10 +31,54 @@ Wed Apr 24 00:42:41 2002 NAKAMURA Usaku <usa@ruby-lang.org>
* lib/mkmf.rb (create_makefile): add `{$(srcdir)}' when including depend
file.
Mon Apr 22 09:31:30 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_thread_cleanup): should not terminate main_thread by
Fatal error.
* regex.c (is_in_list): need to not exclude NUL and NEWLINE.
Sat Apr 20 00:19:13 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* re.c (rb_reg_expr_str): wrong backslash escapement.
* re.c (rb_reg_expr_str): do not escape embedded space
characters.
Fri Apr 19 17:06:48 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* ext/socket/extconf.rb: include <windows.h>, <winsock.h> on _WIN32.
Fri Apr 19 01:08:20 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_thread_cleanup): current thread may be THREAD_STOPPED,
for example when terminated from signal handler.
Wed Apr 17 16:53:33 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* re.c (rb_reg_expr_str): should treat backslash specially in
escaping.
Mon Apr 15 18:12:57 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* bignum.c (rb_big_eq): check `y == x' if y is neither Fixnum,
Bignum, nor Float.
Mon Apr 15 09:27:31 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* pack.c (pack_unpack): should treat 'U' in character unit, not in
byte unit.
Thu Apr 11 23:54:36 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* marshal.c (w_uclass): should check based on rb_obj_class(), not
CLASS_OF().
Thu Apr 11 20:01:44 2002 Masahiro Tomita <tommy@tmtm.org>
* io.c (io_write): check error if written data is less than
specified size to detect EPIPE.
Thu Apr 11 18:40:38 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* io.c (read_all): return "" if file.size == 0.
@ -34,6 +87,22 @@ Thu Apr 11 18:40:38 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* configure.in: ditto.
Thu Apr 11 07:57:48 2002 Michal Rokos <m.rokos@sh.cvut.cz>
* eval.c (assign): ruby_verbose should be surrounded by RTEST().
* object.c (rb_str2cstr): ditto.
* parse.y (void_expr): ditto.
* parse.y (void_stmts): ditto.
* variable.c (rb_ivar_get): ditto.
* variable.c (rb_cvar_set): ditto.
* variable.c (rb_cvar_get): ditto.
Thu Apr 11 01:55:52 2002 Wakou Aoyama <wakou@fsinet.or.jp>
* lib/cgi/session.rb: support for multipart form.

View file

@ -597,7 +597,7 @@ rb_big_eq(x, y)
case T_FLOAT:
return (rb_big2dbl(x) == RFLOAT(y)->value)?Qtrue:Qfalse;
default:
return Qfalse;
return rb_equal(y, x);
}
if (RBIGNUM(x)->sign != RBIGNUM(y)->sign) return Qfalse;
if (RBIGNUM(x)->len != RBIGNUM(y)->len) return Qfalse;

6
eval.c
View file

@ -3819,7 +3819,7 @@ assign(self, lhs, val, check)
break;
case NODE_CVDECL:
if (ruby_verbose && FL_TEST(ruby_cbase, FL_SINGLETON)) {
if (RTEST(ruby_verbose) && FL_TEST(ruby_cbase, FL_SINGLETON)) {
rb_warn("declaring singleton class variable");
}
rb_cvar_declare(cvar_cbase(), lhs->nd_vid, val);
@ -8533,13 +8533,15 @@ rb_thread_cleanup()
}
FOREACH_THREAD(th) {
if (th != curr_thread && th->status != THREAD_KILLED) {
if (th->status != THREAD_KILLED) {
rb_thread_ready(th);
th->gid = 0;
th->priority = 0;
if (th != main_thread) {
th->status = THREAD_TO_KILL;
}
}
}
END_FOREACH(th);
}

4
file.c
View file

@ -2241,6 +2241,10 @@ rb_find_file(path)
if (file_load_ok(f)) return path;
}
if (rb_safe_level() >= 4) {
rb_raise(rb_eSecurityError, "loading from non-absolute path %s", f);
}
if (rb_load_path) {
int i;

4
io.c
View file

@ -250,11 +250,11 @@ io_write(io, str)
break;
n = ptr - RSTRING(str)->ptr;
}
if (n == 0 && ferror(f))
if (n != RSTRING(str)->len && ferror(f))
rb_sys_fail(fptr->path);
#else
n = fwrite(RSTRING(str)->ptr, 1, RSTRING(str)->len, f);
if (n == 0 && ferror(f)) {
if (n != RSTRING(str)->len && ferror(f)) {
rb_sys_fail(fptr->path);
}
#endif

View file

@ -1164,12 +1164,12 @@ convert string charset, and set language to "ja".
checkbox_group("name", ["foo"], ["bar", true], "baz")
# <INPUT TYPE="checkbox" NAME="name" VALUE="foo">foo
# <INPUT TYPE="checkbox" SELECTED NAME="name" VALUE="bar">bar
# <INPUT TYPE="checkbox" CHECKED NAME="name" VALUE="bar">bar
# <INPUT TYPE="checkbox" NAME="name" VALUE="baz">baz
checkbox_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz")
# <INPUT TYPE="checkbox" NAME="name" VALUE="1">Foo
# <INPUT TYPE="checkbox" SELECTED NAME="name" VALUE="2">Bar
# <INPUT TYPE="checkbox" CHECKED NAME="name" VALUE="2">Bar
# <INPUT TYPE="checkbox" NAME="name" VALUE="Baz">Baz
checkbox_group({ "NAME" => "name",
@ -1211,7 +1211,7 @@ convert string charset, and set language to "ja".
# <INPUT TYPE="file" NAME="name" SIZE="40">
file_field("name", 40, 100)
# <INPUT TYPE="file" NAME="name" SIZE="40", MAXLENGTH="100">
# <INPUT TYPE="file" NAME="name" SIZE="40" MAXLENGTH="100">
file_field({ "NAME" => "name", "SIZE" => 40 })
# <INPUT TYPE="file" NAME="name" SIZE="40">
@ -1370,7 +1370,7 @@ The hash keys are case sensitive. Ask the samples.
# <INPUT TYPE="image" SRC="url">
image_button("url", "name", "string")
# <INPUT TYPE="image" SRC="url" NAME="name", ALT="string">
# <INPUT TYPE="image" SRC="url" NAME="name" ALT="string">
image_button({ "SRC" => "url", "ATL" => "strng" })
# <INPUT TYPE="image" SRC="url" ALT="string">
@ -1391,10 +1391,10 @@ The hash keys are case sensitive. Ask the samples.
=begin
=== IMG ELEMENT
img("src", "alt", 100, 50)
# <IMG SRC="src" ALT="alt" WIDTH="100", HEIGHT="50">
# <IMG SRC="src" ALT="alt" WIDTH="100" HEIGHT="50">
img({ "SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50 })
# <IMG SRC="src" ALT="alt" WIDTH="100", HEIGHT="50">
# <IMG SRC="src" ALT="alt" WIDTH="100" HEIGHT="50">
=end
def img(src = "", alt = "", width = nil, height = nil)
attributes = if src.kind_of?(String)
@ -1448,7 +1448,7 @@ The hash keys are case sensitive. Ask the samples.
# <INPUT TYPE="password" NAME="name" VALUE="value" SIZE="40">
password_field("password", "value", 80, 200)
# <INPUT TYPE="password" NAME="name" VALUE="value", SIZE="80", MAXLENGTH="200">
# <INPUT TYPE="password" NAME="name" VALUE="value" SIZE="80" MAXLENGTH="200">
password_field({ "NAME" => "name", "VALUE" => "value" })
# <INPUT TYPE="password" NAME="name" VALUE="value">
@ -1534,10 +1534,10 @@ The hash keys are case sensitive. Ask the samples.
=begin
=== RADIO_BUTTON
radio_button("name", "value")
# <INPUT TYPE="radio" NAME="name", VALUE="value">
# <INPUT TYPE="radio" NAME="name" VALUE="value">
radio_button("name", "value", true)
# <INPUT TYPE="radio" NAME="name", VALUE="value", CHECKED>
# <INPUT TYPE="radio" NAME="name" VALUE="value" CHECKED>
radio_button({ "NAME" => "name", "VALUE" => "value", "ID" => "foo" })
# <INPUT TYPE="radio" NAME="name" VALUE="value" ID="foo">
@ -1563,12 +1563,12 @@ The hash keys are case sensitive. Ask the samples.
radio_group("name", ["foo"], ["bar", true], "baz")
# <INPUT TYPE="radio" NAME="name" VALUE="foo">foo
# <INPUT TYPE="radio" SELECTED NAME="name" VALUE="bar">bar
# <INPUT TYPE="radio" CHECKED NAME="name" VALUE="bar">bar
# <INPUT TYPE="radio" NAME="name" VALUE="baz">baz
radio_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz")
# <INPUT TYPE="radio" NAME="name" VALUE="1">Foo
# <INPUT TYPE="radio" SELECTED NAME="name" VALUE="2">Bar
# <INPUT TYPE="radio" CHECKED NAME="name" VALUE="2">Bar
# <INPUT TYPE="radio" NAME="name" VALUE="Baz">Baz
radio_group({ "NAME" => "name",
@ -1670,10 +1670,10 @@ The hash keys are case sensitive. Ask the samples.
# <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="40">
text_field("name", "value", 80)
# <INPUT TYPE="text" NAME="name" VALUE="value", SIZE="80">
# <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="80">
text_field("name", "value", 80, 200)
# <INPUT TYPE="text" NAME="name" VALUE="value", SIZE="80", MAXLENGTH="200">
# <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="80" MAXLENGTH="200">
text_field({ "NAME" => "name", "VALUE" => "value" })
# <INPUT TYPE="text" NAME="name" VALUE="value">

View file

@ -246,7 +246,7 @@ w_uclass(obj, klass, arg)
VALUE obj, klass;
struct dump_arg *arg;
{
if (CLASS_OF(obj) != klass) {
if (rb_obj_class(obj) != klass) {
w_byte(TYPE_UCLASS, arg);
w_unique(rb_class2name(CLASS_OF(obj)), arg);
}

View file

@ -1026,7 +1026,7 @@ rb_str2cstr(str, len)
str = rb_str_to_str(str);
}
if (len) *len = RSTRING(str)->len;
else if (ruby_verbose && RSTRING(str)->len != strlen(RSTRING(str)->ptr)) {
else if (RTEST(ruby_verbose) && RSTRING(str)->len != strlen(RSTRING(str)->ptr)) {
rb_warn("string contains \\0 character");
}
return RSTRING(str)->ptr;

4
pack.c
View file

@ -1457,11 +1457,11 @@ pack_unpack(str, fmt)
case 'U':
if (len > send - s) len = send - s;
while (len > 0 && s < send) {
int alen = len;
int alen = send - s;
unsigned long l;
l = utf8_to_uv(s, &alen);
s += alen; len -= alen;
s += alen; len--;
rb_ary_push(ary, rb_uint2inum(l));
}
break;

View file

@ -4493,7 +4493,7 @@ void_expr(node)
{
char *useless = 0;
if (!ruby_verbose) return;
if (!RTEST(ruby_verbose)) return;
if (!node) return;
again:
@ -4590,7 +4590,7 @@ static void
void_stmts(node)
NODE *node;
{
if (!ruby_verbose) return;
if (!RTEST(ruby_verbose)) return;
if (!node) return;
if (nd_type(node) != NODE_BLOCK) return;

72
re.c
View file

@ -220,7 +220,7 @@ rb_reg_expr_str(str, s, len)
need_escape = 1;
break;
}
p++;
p += mbclen(*p);
}
if (!need_escape) {
rb_str_cat(str, s, len);
@ -228,7 +228,7 @@ rb_reg_expr_str(str, s, len)
else {
p = s;
while (p<pend) {
if (*p == '/') {
if (*p == '/' && (s == p || p[-1] != '\\')) {
char c = '\\';
rb_str_cat(str, &c, 1);
rb_str_cat(str, p, 1);
@ -241,35 +241,14 @@ rb_reg_expr_str(str, s, len)
else if (ISPRINT(*p)) {
rb_str_cat(str, p, 1);
}
else {
else if (!ISSPACE(*p)) {
char b[8];
switch (*p) {
case '\r':
rb_str_cat(str, "\\r", 2);
break;
case '\n':
rb_str_cat(str, "\\n", 2);
break;
case '\t':
rb_str_cat(str, "\\t", 2);
break;
case '\f':
rb_str_cat(str, "\\f", 2);
break;
case 007:
rb_str_cat(str, "\\a", 2);
break;
case 013:
rb_str_cat(str, "\\v", 2);
break;
case 033:
rb_str_cat(str, "\\e", 2);
break;
default:
sprintf(b, "\\%03o", *p & 0377);
rb_str_cat(str, b, 4);
break;
}
else {
rb_str_cat(str, p, 1);
}
p++;
}
@ -1063,7 +1042,7 @@ rb_reg_s_quote(argc, argv)
int kcode_saved = reg_kcode;
char *s, *send, *t;
VALUE tmp;
int len;
int len, c;
rb_scan_args(argc, argv, "11", &str, &kcode);
if (!NIL_P(kcode)) {
@ -1077,24 +1056,41 @@ rb_reg_s_quote(argc, argv)
t = RSTRING(tmp)->ptr;
for (; s < send; s++) {
if (ismbchar(*s)) {
int n = mbclen(*s);
c = *s;
if (ismbchar(c)) {
int n = mbclen(c);
while (n-- && s < send)
*t++ = *s++;
s--;
continue;
}
if (*s == '[' || *s == ']'
|| *s == '{' || *s == '}'
|| *s == '(' || *s == ')'
|| *s == '|' || *s == '-'
|| *s == '*' || *s == '.' || *s == '\\'
|| *s == '?' || *s == '+'
|| *s == '^' || *s == '$') {
switch (c) {
case '\t':
c = 't';
*t++ = '\\';
break;
case '\f':
c = 'f';
*t++ = '\\';
break;
case '\r':
c = 'r';
*t++ = '\\';
break;
case '\n':
c = 'n';
*t++ = '\\';
break;
case '[': case ']': case '{': case '}':
case '(': case ')': case '|': case '-':
case '*': case '.': case '\\':
case '?': case '+': case '^': case '$':
case ' ':
*t++ = '\\';
break;
}
*t++ = *s;
*t++ = c;
}
kcode_reset_option();
rb_str_resize(tmp, t - RSTRING(tmp)->ptr);

View file

@ -717,8 +717,7 @@ is_in_list(c, b)
else
j = k;
}
if (i < size && EXTRACT_MBC(&b[i*8]) <= c
&& ((unsigned char)c != '\n' && (unsigned char)c != '\0'))
if (i < size && EXTRACT_MBC(&b[i*8]) <= c)
return 1;
return 0;
}

3
ruby.h
View file

@ -124,12 +124,15 @@ typedef unsigned long ID;
#define FIXNUM_FLAG 0x01
#define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG))
#define LONG2FIX(i) INT2FIX(i)
#define rb_fix_new(v) INT2FIX(v)
VALUE rb_int2inum _((long));
#define INT2NUM(v) rb_int2inum(v)
#define LONG2NUM(v) INT2NUM(v)
#define rb_int_new(v) rb_int2inum(v)
VALUE rb_uint2inum _((unsigned long));
#define UINT2NUM(v) rb_uint2inum(v)
#define ULONG2NUM(v) UINT2NUM(v)
#define rb_uint_new(v) rb_uint2inum(v)
#define FIX2LONG(x) RSHIFT((long)x,1)

View file

@ -342,9 +342,8 @@ static VALUE
undef_getter(id)
ID id;
{
if (ruby_verbose) {
rb_warning("global variable `%s' not initialized", rb_id2name(id));
}
return Qnil;
}
@ -911,9 +910,8 @@ rb_ivar_get(obj, id)
return generic_ivar_get(obj, id);
break;
}
if (ruby_verbose) {
rb_warning("instance variable %s not initialized", rb_id2name(id));
}
return Qnil;
}
@ -1376,7 +1374,7 @@ cvar_set(klass, id, val, warn)
if (OBJ_FROZEN(tmp)) rb_error_frozen("class/module");
if (!OBJ_TAINTED(tmp) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify class variable");
if (warn && ruby_verbose && klass != tmp) {
if (warn && RTEST(ruby_verbose) && klass != tmp) {
rb_warning("already initialized class variable %s", rb_id2name(id));
}
st_insert(RCLASS(tmp)->iv_tbl,id,val);