[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24411] Re: Marshal.load dumps core

From: nobu@...
Date: 2004-10-03 17:14:51 UTC
List: ruby-dev #24411
なかだです。

At Sun, 3 Oct 2004 00:00:05 +0900,
Tanaka Akira wrote in [ruby-dev:24404]:
> 
> 次のようにすると core を吐きます。
> 
> % ./ruby -e '
> class C
>   def marshal_dump
>   end
>   def marshal_load(v)
>     $s.replace ""
>   end
> end
> o = [C.new, "a" * 0x20000]
> $s = Marshal.dump(o)
> p $s.length
> Marshal.load($s)
> '

これでどうでしょうか。


Index: marshal.c
===================================================================
RCS file: /cvs/ruby/src/ruby/marshal.c,v
retrieving revision 1.117
diff -U2 -p -d -r1.117 marshal.c
--- marshal.c	29 Sep 2004 05:15:33 -0000	1.117
+++ marshal.c	3 Oct 2004 17:08:04 -0000
@@ -780,5 +780,6 @@ marshal_dump(argc, argv)
 
 struct load_arg {
-    char *ptr, *end;
+    VALUE src;
+    long pos;
     st_table *symbols;
     VALUE data;
@@ -794,13 +795,13 @@ r_byte(arg)
 {
     int c;
+    VALUE src = arg->src;
 
-    if (!arg->end) {
-	VALUE src = (VALUE)arg->ptr;
+    if (arg->pos == -1L) {
 	VALUE v = rb_funcall2(src, s_getc, 0, 0);
 	if (NIL_P(v)) rb_eof_error();
 	c = (unsigned char)FIX2INT(v);
     }
-    else if (arg->ptr < arg->end) {
-	c = *(unsigned char*)arg->ptr++;
+    else if (arg->pos < RSTRING(src)->len) {
+	c = (unsigned char)RSTRING(src)->ptr[arg->pos++];
     }
     else {
@@ -867,9 +868,8 @@ r_bytes0(len, arg)
     struct load_arg *arg;
 {
-    VALUE str;
+    VALUE str, src = arg->src;
 
     if (len == 0) return rb_str_new(0, 0);
-    if (!arg->end) {
-	VALUE src = (VALUE)arg->ptr;
+    if (arg->pos == -1L) {
 	VALUE n = LONG2NUM(len);
 	str = rb_funcall2(src, s_read, 1, &n);
@@ -880,10 +880,10 @@ r_bytes0(len, arg)
     }
     else {
-	if (arg->ptr + len > arg->end) {
+	if (arg->pos + len > RSTRING(src)->len) {
 	  too_short:
 	    rb_raise(rb_eArgError, "marshal data too short");
 	}
-	str = rb_str_new(arg->ptr, len);
-	arg->ptr += len;
+	str = rb_str_new(RSTRING(src)->ptr + arg->pos, len);
+	arg->pos += len;
     }
     return str;
@@ -1389,9 +1389,9 @@ marshal_load(argc, argv)
 
     rb_scan_args(argc, argv, "11", &port, &proc);
+    arg.src = port;
     if (rb_respond_to(port, rb_intern("to_str"))) {
 	arg.taint = OBJ_TAINTED(port); /* original taintedness */
-	StringValue(port);	       /* possible conversion */
-	arg.ptr = RSTRING(port)->ptr;
-	arg.end = arg.ptr + RSTRING(port)->len;
+	StringValue(arg.src);	       /* possible conversion */
+	arg.pos = 0L;
     }
     else if (rb_respond_to(port, s_getc) && rb_respond_to(port, s_read)) {
@@ -1400,6 +1400,5 @@ marshal_load(argc, argv)
 	}
 	arg.taint = Qtrue;
-	arg.ptr = (char *)port;
-	arg.end = 0;
+	arg.pos = -1L;
     }
     else {


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next