diff options
| author | Tomoyuki Sahara <[email protected]> | 2013-09-30 10:36:29 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2013-09-30 10:36:29 +0900 |
| commit | d75d23294d31c3fea16f849a73823fd9d3f17dd9 (patch) | |
| tree | 6ca59c631b8e2d370eb23187e00051e71bc67284 | |
| parent | b4f0a68fba4b222461ca79feb94d94e325341129 (diff) | |
| download | mruby-d75d23294d31c3fea16f849a73823fd9d3f17dd9.tar.gz mruby-d75d23294d31c3fea16f849a73823fd9d3f17dd9.zip | |
fix descriptor leakage.
| -rw-r--r-- | src/io.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -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) { |
