From db2fe4b8ef549c0794a54178a3e6b2bdd88a6291 Mon Sep 17 00:00:00 2001 From: ngoto Date: Thu, 16 Jul 2015 12:08:56 +0000 Subject: [PATCH] Revert r51209 because signals after stopping timer thread before entering exec(2) system call may be lost. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51265 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 -------- process.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3e6f0aa445..5068764d60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -206,14 +206,6 @@ Fri Jul 10 22:05:50 2015 Nobuyoshi Nakada and use Timeout::Error instead, as using throw/catch to isolate each timeouts now. [ruby-dev:49179] [Bug #11344] -Fri Jul 10 20:13:05 2015 Naohisa Goto - - * process.c (rb_f_exec): rb_exec_without_timer_thread should be - used on every OS, not only on Mac OS X or Haiku, to prevent - timer thread communications using file descriptor 3 after - setting redirection of the fd 3 before calling exec. - [Bug #11336] [ruby-core:69886] - Fri Jul 10 17:41:54 2015 Nobuyoshi Nakada * dir.c (is_case_sensitive): get attributes by the file descriptor diff --git a/process.c b/process.c index 708cea91ce..7d3b1f580a 100644 --- a/process.c +++ b/process.c @@ -2484,7 +2484,9 @@ rb_execarg_parent_end(VALUE execarg_obj) RB_GC_GUARD(execarg_obj); } +#if defined(__APPLE__) || defined(__HAIKU__) static int rb_exec_without_timer_thread(const struct rb_execarg *eargp, char *errmsg, size_t errmsg_buflen); +#endif /* * call-seq: @@ -2572,7 +2574,13 @@ rb_f_exec(int argc, const VALUE *argv) rb_execarg_parent_start(execarg_obj); fail_str = eargp->use_shell ? eargp->invoke.sh.shell_script : eargp->invoke.cmd.command_name; +#if defined(__APPLE__) || defined(__HAIKU__) rb_exec_without_timer_thread(eargp, errmsg, sizeof(errmsg)); +#else + before_exec_async_signal_safe(); /* async-signal-safe */ + rb_exec_async_signal_safe(eargp, errmsg, sizeof(errmsg)); + preserving_errno(after_exec_async_signal_safe()); /* async-signal-safe */ +#endif RB_GC_GUARD(execarg_obj); if (errmsg[0]) rb_sys_fail(errmsg); @@ -3080,6 +3088,7 @@ failure: return -1; } +#if defined(__APPLE__) || defined(__HAIKU__) static int rb_exec_without_timer_thread(const struct rb_execarg *eargp, char *errmsg, size_t errmsg_buflen) { @@ -3089,6 +3098,7 @@ rb_exec_without_timer_thread(const struct rb_execarg *eargp, char *errmsg, size_ preserving_errno(after_exec()); /* not async-signal-safe because it calls rb_thread_start_timer_thread. */ return ret; } +#endif #ifdef HAVE_WORKING_FORK /* This function should be async-signal-safe. Hopefully it is. */