From c1e8d4c0f95d5eb88314a45bab9bbb0ed3dbb426 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 10 Oct 2016 06:22:30 +0000 Subject: 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 --- ruby.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'ruby.c') 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; } -- cgit v1.2.3