diff options
| author | Tomoyuki Sahara <[email protected]> | 2016-10-13 16:57:38 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2016-10-13 16:57:38 +0900 |
| commit | b5e2dc90975e5304f7b1220656d6a9138b51cdee (patch) | |
| tree | c7492d5532b361049a6a1883193a5f42669a4210 | |
| parent | f6a82772e6f857856edb37fcb43a892b6022780f (diff) | |
| download | mruby-b5e2dc90975e5304f7b1220656d6a9138b51cdee.tar.gz mruby-b5e2dc90975e5304f7b1220656d6a9138b51cdee.zip | |
raise an exception when we cannot close "fd" but can close "fd2".
| -rw-r--r-- | src/io.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -465,23 +465,26 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io) static void fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) { - int n = 0; + int saved_errno = 0; if (fptr == NULL) { return; } if (fptr->fd > 2) { - n = close(fptr->fd); - if (n == 0) { - fptr->fd = -1; + if (close(fptr->fd) == -1) { + saved_errno = errno; } + fptr->fd = -1; } + if (fptr->fd2 > 2) { - n = close(fptr->fd2); - if (n == 0) { - fptr->fd2 = -1; + if (close(fptr->fd2) == -1) { + if (saved_errno == 0) { + saved_errno = errno; + } } + fptr->fd2 = -1; } #if !defined(_WIN32) && !defined(_WIN64) @@ -494,10 +497,13 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) if (!quiet && pid == fptr->pid) { io_set_process_status(mrb, pid, status); } + fptr->pid = 0; + /* Note: we don't raise an exception when waitpid(3) fails */ } #endif - if (!quiet && n != 0) { + if (!quiet && saved_errno != 0) { + errno = saved_errno; mrb_sys_fail(mrb, "fptr_finalize failed."); } } |
