Unverified Commit 0e93f1ff authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #3921 from ksss/cloexec

Should be true for close_on_exec flag
parents dfb56074 dc9c40f7
...@@ -180,7 +180,7 @@ mrb_io_flags_to_modenum(mrb_state *mrb, int flags) ...@@ -180,7 +180,7 @@ mrb_io_flags_to_modenum(mrb_state *mrb, int flags)
return modenum; return modenum;
} }
void static void
mrb_fd_cloexec(mrb_state *mrb, int fd) mrb_fd_cloexec(mrb_state *mrb, int fd)
{ {
#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) #if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
...@@ -188,7 +188,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) ...@@ -188,7 +188,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd)
flags = fcntl(fd, F_GETFD); flags = fcntl(fd, F_GETFD);
if (flags == -1) { 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) { if (fd <= 2) {
flags2 = flags & ~FD_CLOEXEC; /* Clear CLOEXEC for standard file descriptors: 0, 1, 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) ...@@ -198,7 +199,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd)
} }
if (flags != flags2) { if (flags != flags2) {
if (fcntl(fd, F_SETFD, flags2) == -1) { 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 #endif
...@@ -577,11 +579,17 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy) ...@@ -577,11 +579,17 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy)
if (failed) { if (failed) {
mrb_sys_fail(mrb, 0); mrb_sys_fail(mrb, 0);
} }
fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); mrb_fd_cloexec(mrb, fptr_copy->fd);
if (failed) {
close(fptr_copy->fd); if (fptr_orig->fd2 != -1) {
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->fd2);
} }
fptr_copy->pid = fptr_orig->pid; fptr_copy->pid = fptr_orig->pid;
fptr_copy->readable = fptr_orig->readable; fptr_copy->readable = fptr_orig->readable;
fptr_copy->writable = fptr_orig->writable; fptr_copy->writable = fptr_orig->writable;
...@@ -676,7 +684,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) ...@@ -676,7 +684,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet)
io_set_process_status(mrb, pid, status); io_set_process_status(mrb, pid, status);
} }
#else #else
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid);
DWORD status; DWORD status;
if (WaitForSingleObject(h, INFINITE) && GetExitCodeProcess(h, &status)) if (WaitForSingleObject(h, INFINITE) && GetExitCodeProcess(h, &status))
if (!quiet) if (!quiet)
......
...@@ -216,6 +216,10 @@ assert('IO#dup for readable') do ...@@ -216,6 +216,10 @@ assert('IO#dup for readable') do
dup = io.dup dup = io.dup
assert_true io != dup assert_true io != dup
assert_true io.fileno != dup.fileno assert_true io.fileno != dup.fileno
begin
assert_true dup.close_on_exec?
rescue NotImplementedError
end
assert_equal 'm', dup.sysread(1) assert_equal 'm', dup.sysread(1)
assert_equal 'r', io.sysread(1) assert_equal 'r', io.sysread(1)
assert_equal 'u', dup.sysread(1) assert_equal 'u', dup.sysread(1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment