summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--io.c8
-rw-r--r--marshal.c7
-rw-r--r--rubyio.h1
4 files changed, 20 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index cf97c92a250..8e553c04bc6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Fri Aug 16 11:47:24 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
+
+ * 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 <nobu.nokada@softhome.net>
* eval.c (compile_error): must not clear ruby_sourcefile here.
diff --git a/io.c b/io.c
index 591ac8d105a..62b2c361181 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 9bed4296fc5..94a2eb56da8 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 3ec91680b5b..8d2a307514a 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*));