diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-01-24 22:04:05 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-01-24 22:04:05 +0900 |
| commit | 0e93f1ff1263f9d0cabe3f8083ca7adad9b9e556 (patch) | |
| tree | bb996d7b21252fbc7fb3b586d3e1fcf8974ff1d4 | |
| parent | dfb56074d6d0908c76bf618d526990497ca0271e (diff) | |
| parent | dc9c40f72d5df55dff7c2ebb5b92b9489ad10ecd (diff) | |
| download | mruby-0e93f1ff1263f9d0cabe3f8083ca7adad9b9e556.tar.gz mruby-0e93f1ff1263f9d0cabe3f8083ca7adad9b9e556.zip | |
Merge pull request #3921 from ksss/cloexec
Should be true for close_on_exec flag
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 24 | ||||
| -rw-r--r-- | mrbgems/mruby-io/test/io.rb | 4 |
2 files changed, 20 insertions, 8 deletions
diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 21a733b00..58bcdd1ee 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -180,7 +180,7 @@ mrb_io_flags_to_modenum(mrb_state *mrb, int flags) return modenum; } -void +static void mrb_fd_cloexec(mrb_state *mrb, int fd) { #if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) @@ -188,7 +188,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) flags = fcntl(fd, F_GETFD); if (flags == -1) { - mrb_sys_fail(mrb, "fcntl"); + mrb_bug(mrb, "mrb_fd_cloexec: fcntl(%S, F_GETFD) failed: %S", + mrb_fixnum_value(fd), mrb_fixnum_value(errno)); } if (fd <= 2) { flags2 = flags & ~FD_CLOEXEC; /* Clear CLOEXEC for standard file descriptors: 0, 1, 2. */ @@ -198,7 +199,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) } if (flags != flags2) { if (fcntl(fd, F_SETFD, flags2) == -1) { - mrb_sys_fail(mrb, "fcntl"); + mrb_bug(mrb, "mrb_fd_cloexec: fcntl(%S, F_SETFD, %S) failed: %S", + mrb_fixnum_value(fd), mrb_fixnum_value(flags2), mrb_fixnum_value(errno)); } } #endif @@ -577,11 +579,17 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy) if (failed) { mrb_sys_fail(mrb, 0); } - fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); - if (failed) { - close(fptr_copy->fd); - mrb_sys_fail(mrb, 0); + mrb_fd_cloexec(mrb, fptr_copy->fd); + + if (fptr_orig->fd2 != -1) { + fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); + if (failed) { + close(fptr_copy->fd); + mrb_sys_fail(mrb, 0); + } + mrb_fd_cloexec(mrb, fptr_copy->fd2); } + fptr_copy->pid = fptr_orig->pid; fptr_copy->readable = fptr_orig->readable; fptr_copy->writable = fptr_orig->writable; @@ -676,7 +684,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) io_set_process_status(mrb, pid, status); } #else - HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); + HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); DWORD status; if (WaitForSingleObject(h, INFINITE) && GetExitCodeProcess(h, &status)) if (!quiet) diff --git a/mrbgems/mruby-io/test/io.rb b/mrbgems/mruby-io/test/io.rb index 96c3495d0..e06b14996 100644 --- a/mrbgems/mruby-io/test/io.rb +++ b/mrbgems/mruby-io/test/io.rb @@ -216,6 +216,10 @@ assert('IO#dup for readable') do dup = io.dup assert_true io != dup assert_true io.fileno != dup.fileno + begin + assert_true dup.close_on_exec? + rescue NotImplementedError + end assert_equal 'm', dup.sysread(1) assert_equal 'r', io.sysread(1) assert_equal 'u', dup.sysread(1) |
