From 9439b981d816a25883bd9d8f05af62664f21e0bc Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 4 Dec 2014 09:05:24 +0900 Subject: Opened fd should be set FD_CLOEXEC by default --- test/io.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'test') diff --git a/test/io.rb b/test/io.rb index 006c7cc8d..9c7ce741f 100644 --- a/test/io.rb +++ b/test/io.rb @@ -362,28 +362,28 @@ assert('IO#fileno') do io.closed? end -assert('IO#close_on_exec') do +assert('IO#close_on_exec') do fd = IO.sysopen $mrbtest_io_wfname, "w" io = IO.new fd, "w" - begin - # IO.sysopen opens a file descripter without O_CLOEXEC flag. - assert_equal(false, io.close_on_exec?) + begin + # IO.sysopen opens a file descripter with O_CLOEXEC flag. + assert_true io.close_on_exec? rescue ScriptError skip "IO\#close_on_exec is not implemented." end - io.close_on_exec = true - assert_equal(true, io.close_on_exec?) io.close_on_exec = false assert_equal(false, io.close_on_exec?) io.close_on_exec = true assert_equal(true, io.close_on_exec?) - + io.close_on_exec = false + assert_equal(false, io.close_on_exec?) + io.close io.closed? # # Use below when IO.pipe is implemented. - # begin + # begin # r, w = IO.pipe # assert_equal(false, r.close_on_exec?) # r.close_on_exec = true -- cgit v1.2.3 From e61c46972482ca2b4e9b338f9ccfa4ee13efa62d Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 4 Dec 2014 10:21:29 +0900 Subject: IO.popen fd set close_on_exec flag by default --- src/io.c | 21 +++++++++++++++------ test/io.rb | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'test') diff --git a/src/io.c b/src/io.c index 560fba3de..3f299775e 100644 --- a/src/io.c +++ b/src/io.c @@ -223,13 +223,22 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) doexec = (strcmp("-", pname) != 0); - if ((flags & FMODE_READABLE) && pipe(pr) == -1) { - mrb_sys_fail(mrb, "pipe"); + if (flags & FMODE_READABLE) { + if (pipe(pr) == -1) { + mrb_sys_fail(mrb, "pipe"); + } + mrb_fd_cloexec(mrb, pr[0]); + mrb_fd_cloexec(mrb, pr[1]); } - if ((flags & FMODE_WRITABLE) && pipe(pw) == -1) { - if (pr[0] != -1) close(pr[0]); - if (pr[1] != -1) close(pr[1]); - mrb_sys_fail(mrb, "pipe"); + + if (flags & FMODE_WRITABLE) { + if (pipe(pw) == -1) { + if (pr[0] != -1) close(pr[0]); + if (pr[1] != -1) close(pr[1]); + mrb_sys_fail(mrb, "pipe"); + } + mrb_fd_cloexec(mrb, pw[0]); + mrb_fd_cloexec(mrb, pw[1]); } if (!doexec) { diff --git a/test/io.rb b/test/io.rb index 9c7ce741f..b828fef49 100644 --- a/test/io.rb +++ b/test/io.rb @@ -321,6 +321,7 @@ end assert('IO.popen') do io = IO.popen("ls") + assert_true io.close_on_exec? assert_equal Fixnum, io.pid.class ls = io.read assert_equal ls.class, String -- cgit v1.2.3