From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS3223 5.254.79.0/24 X-Spam-Status: No, score=-2.9 required=3.0 tests=AWL,BAYES_00, RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,RDNS_NONE,SPF_FAIL, SPF_HELO_FAIL,TO_EQ_FM_DOM_SPF_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (unknown [5.254.79.66]) by dcvr.yhbt.net (Postfix) with ESMTP id DA71C2047F for ; Tue, 19 Sep 2017 22:32:54 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH] [Bug #13916] attempted fix - lightly tested Date: Tue, 19 Sep 2017 22:32:50 +0000 Message-Id: <20170919223250.22840-1-e@80x24.org> List-Id: --- process.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/process.c b/process.c index ba03699e65..d0d014b9d4 100644 --- a/process.c +++ b/process.c @@ -3633,7 +3633,7 @@ rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), voi } static rb_pid_t -retry_fork_ruby(int *status) +retry_fork_ruby(int *status, struct child_handler_disabler_state *old) { rb_pid_t pid; int try_gc = 1; @@ -3641,10 +3641,13 @@ retry_fork_ruby(int *status) while (1) { prefork(); before_fork_ruby(); + disable_child_handler_before_fork(old); pid = fork(); - if (pid == 0) /* fork succeed, child process */ + if (pid == 0) /* fork succeed, child process */ { return pid; + } preserving_errno(after_fork_ruby()); + preserving_errno(disable_child_handler_fork_parent(old)); if (0 < pid) /* fork succeed, parent process */ return pid; /* fork failed */ @@ -3657,14 +3660,16 @@ rb_pid_t rb_fork_ruby(int *status) { rb_pid_t pid; + struct child_handler_disabler_state old; if (status) *status = 0; - pid = retry_fork_ruby(status); + pid = retry_fork_ruby(status, &old); if (pid < 0) return pid; if (!pid) { after_fork_ruby(); + disable_child_handler_fork_parent(&old); /* yes, bad name */ } return pid; } -- EW