From a0a77c5b33858ca8d567e9bceee3d7882db58a19 Mon Sep 17 00:00:00 2001 From: kosaki Date: Sun, 18 Oct 2015 00:40:57 +0000 Subject: re-commit r52152 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52159 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- io.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'io.c') diff --git a/io.c b/io.c index b7e3316e3f..682f733b95 100644 --- a/io.c +++ b/io.c @@ -4263,6 +4263,7 @@ fptr_finalize(rb_io_t *fptr, int noraise) VALUE err = Qnil; int fd = fptr->fd; FILE *stdio_file = fptr->stdio_file; + int mode = fptr->mode; if (fptr->writeconv) { if (fptr->write_lock && !noraise) { @@ -4303,7 +4304,11 @@ fptr_finalize(rb_io_t *fptr, int noraise) /* fptr->fd may be closed even if close fails. * POSIX doesn't specify it. * We assumes it is closed. */ - if ((maygvl_close(fd, noraise) < 0) && NIL_P(err)) + + /**/ + int keepgvl = !(mode & FMODE_WRITABLE); + keepgvl |= noraise; + if ((maygvl_close(fd, keepgvl) < 0) && NIL_P(err)) err = noraise ? Qtrue : INT2NUM(errno); } -- cgit v1.2.3