summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-08-19 07:33:15 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-08-19 07:33:15 +0000
commitd73fa69935a2d6657e13bfe2d3fa266fef55614d (patch)
tree2b91232f5c6bf8601ed38337fae396d2e391a41e /io.c
parent4c57b2b49905d652fb500249c34303d8c0571155 (diff)
* dir.c (free_dir): fix memory leak. reported by yamamoto
madoka. * eval.c (bind_eval): new method. [RCR 251] * string.c (rb_str_clear): new method. [ruby-dev:24104] * io.c (rb_io_reopen): should clear allocated OpenFile. pointed out by Guy Decoux. [ruby-core:03288] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6794 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/io.c b/io.c
index 29839d376c..d64e41d683 100644
--- a/io.c
+++ b/io.c
@@ -235,9 +235,6 @@ rb_io_check_readable(fptr)
OpenFile *fptr;
{
rb_io_check_closed(fptr);
- if (!(fptr->mode & FMODE_READABLE)) {
- rb_raise(rb_eIOError, "not opened for reading");
- }
#if NEED_IO_SEEK_BETWEEN_RW
if (((fptr->mode & FMODE_WBUF) ||
(fptr->mode & (FMODE_SYNCWRITE|FMODE_RBUF)) == FMODE_SYNCWRITE) &&
@@ -257,6 +254,9 @@ rb_io_check_writable(fptr)
if (!(fptr->mode & FMODE_WRITABLE)) {
rb_raise(rb_eIOError, "not opened for writing");
}
+ if (READ_DATA_BUFFERED(fptr->f)) {
+ rb_warn("read buffer data lost");
+ }
#if NEED_IO_SEEK_BETWEEN_RW
if ((fptr->mode & FMODE_RBUF) && !feof(fptr->f) && !fptr->f2) {
io_seek(fptr, 0, SEEK_CUR);
@@ -1913,10 +1913,9 @@ rb_io_fptr_finalize(fptr)
free(fptr->path);
fptr->path = 0;
}
- if (!fptr->f && !fptr->f2) return 0;
- if (fileno(fptr->f) < 3) return 0;
-
- rb_io_fptr_cleanup(fptr, Qtrue);
+ if ((fptr->f && fileno(fptr->f) > 2) || fptr->f2) {
+ rb_io_fptr_cleanup(fptr, Qtrue);
+ }
free(fptr);
return 1;
}