summaryrefslogtreecommitdiffhomepage
path: root/src/io.c
diff options
context:
space:
mode:
authorksss <[email protected]>2014-12-04 10:21:29 +0900
committerksss <[email protected]>2014-12-04 10:25:03 +0900
commite61c46972482ca2b4e9b338f9ccfa4ee13efa62d (patch)
treea050a34dc2ac07995530f438d39850ae0cd2fa5d /src/io.c
parent9439b981d816a25883bd9d8f05af62664f21e0bc (diff)
downloadmruby-e61c46972482ca2b4e9b338f9ccfa4ee13efa62d.tar.gz
mruby-e61c46972482ca2b4e9b338f9ccfa4ee13efa62d.zip
IO.popen fd set close_on_exec flag by default
Diffstat (limited to 'src/io.c')
-rw-r--r--src/io.c21
1 files changed, 15 insertions, 6 deletions
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) {