aboutsummaryrefslogtreecommitdiffstats
path: root/ruby.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-10 06:22:30 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-10 06:22:30 +0000
commitc1e8d4c0f95d5eb88314a45bab9bbb0ed3dbb426 (patch)
tree4f9388417afcdfe816be26a1dafa354128865606 /ruby.c
parent20f197dd23f544f6008d28eac7c65959f39a92d9 (diff)
downloadruby-c1e8d4c0f95d5eb88314a45bab9bbb0ed3dbb426.tar.gz
ruby.c: bind fd before waiting
* ruby.c (open_load_file): bind the open fd to an IO instance before waiting FIFO, not to leak the fd if interrupted. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.c')
-rw-r--r--ruby.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/ruby.c b/ruby.c
index 8678bcce2c..287e22aaaa 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1916,22 +1916,20 @@ open_load_file(VALUE fname_v, int *xflag)
#endif
e = ruby_is_fd_loadable(fd);
- if (e <= 0) {
- if (!e) {
- e = errno;
- (void)close(fd);
- rb_load_fail(fname_v, strerror(e));
- }
- else {
- /*
- We need to wait if FIFO is empty. It's FIFO's semantics.
- rb_thread_wait_fd() release GVL. So, it's safe.
- */
- rb_thread_wait_fd(fd);
- }
+ if (!e) {
+ e = errno;
+ (void)close(fd);
+ rb_load_fail(fname_v, strerror(e));
}
f = rb_io_fdopen(fd, mode, fname);
+ if (e < 0) {
+ /*
+ We need to wait if FIFO is empty. It's FIFO's semantics.
+ rb_thread_wait_fd() release GVL. So, it's safe.
+ */
+ rb_thread_wait_fd(fd);
+ }
}
return f;
}