summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-09-30 10:36:29 +0900
committerTomoyuki Sahara <[email protected]>2013-09-30 10:36:29 +0900
commitd75d23294d31c3fea16f849a73823fd9d3f17dd9 (patch)
tree6ca59c631b8e2d370eb23187e00051e71bc67284 /src
parentb4f0a68fba4b222461ca79feb94d94e325341129 (diff)
downloadmruby-d75d23294d31c3fea16f849a73823fd9d3f17dd9.tar.gz
mruby-d75d23294d31c3fea16f849a73823fd9d3f17dd9.zip
fix descriptor leakage.
Diffstat (limited to 'src')
-rw-r--r--src/io.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/io.c b/src/io.c
index 8044874e9..284d90877 100644
--- a/src/io.c
+++ b/src/io.c
@@ -195,7 +195,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
struct mrb_io *fptr;
const char *pname;
int pid, flags, fd, write_fd = -1;
- int pr[2], pw[2];
+ int pr[2] = { -1, -1 };
+ int pw[2] = { -1, -1 };
int doexec;
mrb_get_args(mrb, "S|SH", &cmd, &mode, &opt);
@@ -206,10 +207,13 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
doexec = (strcmp("-", pname) != 0);
- if (((flags & FMODE_READABLE) && pipe(pr) == -1)
- || ((flags & FMODE_WRITABLE) && pipe(pw) == -1)) {
- mrb_sys_fail(mrb, "pipe_open failed.");
- return mrb_nil_value();
+ if ((flags & FMODE_READABLE) && pipe(pr) == -1) {
+ mrb_sys_fail(mrb, "pipe");
+ }
+ 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 (!doexec) {