summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-08-16 02:52:25 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-08-16 02:52:25 +0000
commit2229b70615ce502c567d6c27357ac2ccfa70eefd (patch)
tree6036f34b37a752dbc9708aa110a936a13484b5a7
parent3d923fb9285b4bae77925d362118a463e00867e4 (diff)
* 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
-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 cf97c92..8e553c0 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 591ac8d..62b2c36 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 9bed429..94a2eb5 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 3ec9168..8d2a307 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*));