From: matz@... (Yukihiro Matsumoto) Date: 1999-06-18T16:19:40+09:00 Subject: [ruby-dev:7133] Re: EOF during Marshal.load まつもと ゆきひろです In message "[ruby-dev:7132] EOF during Marshal.load" on 99/06/18, Masaki Fukushima 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)) {