From d75d23294d31c3fea16f849a73823fd9d3f17dd9 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Mon, 30 Sep 2013 10:36:29 +0900 Subject: fix descriptor leakage. --- src/io.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src') 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) { -- cgit v1.2.3