[#7102] Ruby 1.3.4-990611 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.4-990611 is out, check out:

20 messages 1999/06/11

[#7223] Ruby 1.3.4-990625 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.4-990625 is out, check out:

14 messages 1999/06/25
[#7224] -Wl,-rpath on Linux (Re: Ruby 1.3.4-990625) — Ryo HAYASAKA <hayasaka@...21.u-aizu.ac.jp> 1999/06/25

早坂@会津大学です。

[ruby-dev:7133] Re: EOF during Marshal.load

From: matz@... (Yukihiro Matsumoto)
Date: 1999-06-18 07:19:40 UTC
List: ruby-dev #7133
まつもと ゆきひろです

In message "[ruby-dev:7132] EOF during Marshal.load"
    on 99/06/18, Masaki Fukushima <fukusima@goto.info.waseda.ac.jp> writes:

|Marshal.load に対して、EOFに達しているIOを渡すと、
|
|  old marshal file format (can't read) (TypeError)
|
|という例外が発生しますが、以下のようにした方が分かり易いのではな
|いでしょうか。

まったくです。ついでですから、r_byte()そのものを書き換えて、
他の部分でもチェックが有効であるようにしました。

--- marshal.c	1999/06/09 09:21:15	1.1.1.2.2.6
+++ marshal.c	1999/06/18 07:19:19
@@ -458,7 +458,17 @@
     struct load_arg *arg;
 {
-    if (arg->fp) return rb_getc(arg->fp);
-    if (arg->ptr < arg->end) return *(unsigned char*)arg->ptr++;
-    return EOF;
+    int c;
+
+    if (arg->fp) {
+	c = rb_getc(arg->fp);
+	if (c == EOF) rb_eof_error();
+    }
+    else if (arg->ptr < arg->end) {
+	c = *(unsigned char*)arg->ptr++;
+    }
+    else {
+	rb_raise(rb_eArgError, "marshal data too short");
+    }
+    return c;
 }
 
@@ -605,8 +615,4 @@
 
     switch (type) {
-      case EOF:
-	rb_eof_error();
-	return Qnil;
-
       case TYPE_LINK:
 	if (st_lookup(arg->data, r_long(arg), &v)) {

In This Thread