summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--process.c11
2 files changed, 16 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f80e3234a..f86e2e88c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jun 6 12:37:43 2012 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * process.c (rb_run_exec_options_err): allocate a temporary buffer for
+ run_exec_dup2() for restoring fds on non-fork environments.
+
Wed Jun 6 09:45:21 2012 NAKAMURA Usaku <usa@ruby-lang.org>
* test/dl/test_c_{struct_entry,union_entity}.rb: sorry, typos.
diff --git a/process.c b/process.c
index eb0c3a2a3c..6b907b3dba 100644
--- a/process.c
+++ b/process.c
@@ -2460,6 +2460,7 @@ rb_run_exec_options_err(const struct rb_exec_arg *e, struct rb_exec_arg *s, char
return 0;
if (s) {
+ /* assume that s is always NULL on fork-able environments */
s->options = soptions = hide_obj(rb_ary_new());
s->redirect_fds = Qnil;
s->envp_str = s->envp_buf = 0;
@@ -2561,6 +2562,16 @@ rb_run_exec_options_err(const struct rb_exec_arg *e, struct rb_exec_arg *s, char
}
}
+ if (s) {
+ VALUE ary = rb_ary_entry(s->options, EXEC_OPTION_DUP2);
+ if (!NIL_P(ary)) {
+ size_t len = run_exec_dup2_tmpbuf_size(RARRAY_LEN(ary));
+ VALUE tmpbuf = hide_obj(rb_str_new(0, len));
+ rb_str_set_len(tmpbuf, len);
+ s->dup2_tmpbuf = tmpbuf;
+ }
+ }
+
return 0;
}