diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-25 06:08:12 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-25 06:08:12 +0000 |
commit | f20234994e8589a974bd6f2e057055b2e521f9ed (patch) | |
tree | daab4f1e1f827a3145c405b50fe117d1678b78c0 /io.c | |
parent | 9541c63080623dbfa8b009eccc344920e8adac93 (diff) | |
download | ruby-f20234994e8589a974bd6f2e057055b2e521f9ed.tar.gz |
* io.c (fptr_finalize): close the IO object even if close(2) is failed.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20987 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 29 |
1 files changed, 11 insertions, 18 deletions
@@ -3104,7 +3104,7 @@ finish_writeconv_sync(VALUE arg) static void fptr_finalize(rb_io_t *fptr, int noraise) { - int ebadf = 0; + int close_failure = 0; if (fptr->writeconv) { if (fptr->write_lock) { struct finish_writeconv_arg arg; @@ -3124,29 +3124,22 @@ fptr_finalize(rb_io_t *fptr, int noraise) return; } if (fptr->stdio_file) { - if (fclose(fptr->stdio_file) < 0 && !noraise) { - /* fptr->stdio_file is deallocated anyway */ - fptr->stdio_file = 0; - fptr->fd = -1; - rb_sys_fail_path(fptr->pathv); - } + /* fptr->stdio_file is deallocated anyway + * even if fclose failed. */ + if (fclose(fptr->stdio_file) < 0) + close_failure = 1; } else if (0 <= fptr->fd) { - if (close(fptr->fd) < 0 && !noraise) { - if (errno != EBADF) { - /* fptr->fd is still not closed */ - rb_sys_fail_path(fptr->pathv); - } - else { - /* fptr->fd is already closed. */ - ebadf = 1; - } - } + /* fptr->fd may be closed even if close fails. + * POSIX doesn't specify it. + * We assumes it is closed. */ + if (close(fptr->fd) < 0) + close_failure = 1; } fptr->fd = -1; fptr->stdio_file = 0; fptr->mode &= ~(FMODE_READABLE|FMODE_WRITABLE); - if (ebadf) { + if (close_failure && !noraise) { rb_sys_fail_path(fptr->pathv); } } |