From 2229b70615ce502c567d6c27357ac2ccfa70eefd Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 16 Aug 2002 02:52:25 +0000 Subject: [PATCH] * io.c (rb_io_fread): renamed from io_fread and made extern. * marshal.c (r_bytes0): check if successfully read, use rb_io_fread() instead of fread() to be preemptive. (ruby-bugs-ja:PR#294, 295) * rubyio.h (rb_io_fread): added. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ io.c | 8 ++++---- marshal.c | 7 +++++-- rubyio.h | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index cf97c92a25..8e553c04bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Fri Aug 16 11:47:24 2002 Nobuyoshi Nakada + + * io.c (rb_io_fread): renamed from io_fread and made extern. + + * marshal.c (r_bytes0): check if successfully read, use + rb_io_fread() instead of fread() to be preemptive. + (ruby-bugs-ja:PR#294, 295) + + * rubyio.h (rb_io_fread): added. + Fri Aug 16 07:57:26 2002 Nobuyoshi Nakada * eval.c (compile_error): must not clear ruby_sourcefile here. diff --git a/io.c b/io.c index 591ac8d105..62b2c36118 100644 --- a/io.c +++ b/io.c @@ -542,8 +542,8 @@ rb_io_to_io(io) /* reading functions */ -static long -io_fread(ptr, len, f) +long +rb_io_fread(ptr, len, f) char *ptr; long len; FILE *f; @@ -650,7 +650,7 @@ read_all(fptr, siz) if (!siz) siz = BUFSIZ; str = rb_tainted_str_new(0, siz); for (;;) { - n = io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f); + n = rb_io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f); if (n == 0 && bytes == 0) { if (feof(fptr->f)) return Qnil; rb_sys_fail(fptr->path); @@ -694,7 +694,7 @@ io_read(argc, argv, io) if (len == 0) return str; READ_CHECK(fptr->f); - n = io_fread(RSTRING(str)->ptr, len, fptr->f); + n = rb_io_fread(RSTRING(str)->ptr, len, fptr->f); if (n == 0) { if (feof(fptr->f)) return Qnil; rb_sys_fail(fptr->path); diff --git a/marshal.c b/marshal.c index 9bed4296fc..94a2eb56da 100644 --- a/marshal.c +++ b/marshal.c @@ -712,11 +712,14 @@ r_bytes0(s, len, arg) struct load_arg *arg; { if (arg->fp) { - len = fread(s, 1, len, arg->fp); + if (rb_io_fread(s, len, arg->fp) != len) { + too_short: + rb_raise(rb_eArgError, "marshal data too short"); + } } else { if (arg->ptr + len > arg->end) { - len = arg->end - arg->ptr; + goto too_short; } memcpy(s, arg->ptr, len); arg->ptr += len; diff --git a/rubyio.h b/rubyio.h index 3ec91680b5..8d2a307514 100644 --- a/rubyio.h +++ b/rubyio.h @@ -57,6 +57,7 @@ typedef struct OpenFile { FILE *rb_fopen _((const char*, const char*)); FILE *rb_fdopen _((int, const char*)); int rb_getc _((FILE*)); +long rb_io_fread _((char *, long, FILE *)); int rb_io_mode_flags _((const char*)); void rb_io_check_writable _((OpenFile*)); void rb_io_check_readable _((OpenFile*));