From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2201) id 894573857351; Tue, 18 Jul 2023 15:47:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 894573857351 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1689695251; bh=ge/pR0mc80dF6KVIWDEfjXH7CATTM+P+TT5KIUUroM0=; h=From:To:Subject:Date:From; b=sp1g76UGAf81H1Xthr1Kxh+4WOydZ/BRkFr0uJD4d8K6oOzp9KahayiN5YjY3f7Iv ka4bikkrE1PXwnFYuyyQ0HqOWTaYvNy+3QGgvO8GGjSa23UeYPSCJRkYCPDRGJj3GU YPxgOm46XOKUgiMwmzekVixlZKxUBPCzJ47FErw4= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Jon Turney To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: Restore signal handlers on thread cancellation during system() X-Act-Checkin: newlib-cygwin X-Git-Author: Jon Turney X-Git-Refname: refs/heads/master X-Git-Oldrev: c431f6b7fe11edc1e1cb1a8aec1205ca1713402b X-Git-Newrev: 89e80d414b9d4ec71c6d43503704f7b3da3a2407 Message-Id: <20230718154731.894573857351@sourceware.org> Date: Tue, 18 Jul 2023 15:47:31 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D89e80d414b9= d4ec71c6d43503704f7b3da3a2407 commit 89e80d414b9d4ec71c6d43503704f7b3da3a2407 Author: Jon Turney Date: Sun Jul 16 14:46:00 2023 +0100 Cygwin: Restore signal handlers on thread cancellation during system() =20 Add back the restoration of signal handlers modified during system() on thread cancellation. =20 Removed in 3cb9da14 which describes it as 'ill-conceived' (additional context doesn't appear to be available). =20 We use the internal implementation helpers for the pthread cleanup chain, so we can neatly tuck it inside the object, and keep the point when we restore the signal handlers the same. (The pthread_cleanup_push/pop() functions are implemented as macros which must appear in the same lexical scope.) =20 Fixes: 3cb9da14617c ("Put signals on hold and use system_call_cleanup class to set and restore signals rather than doing it prior to to running the program. Remove the ill-conceived pthread_cleanup stuff.") Signed-off-by: Jon Turney Diff: --- winsup/cygwin/spawn.cc | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 84dd74e28..c16fe269a 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -228,6 +228,8 @@ struct system_call_handle _sig_func_ptr oldint; _sig_func_ptr oldquit; sigset_t oldmask; + __pthread_cleanup_handler cleanup_handler; + bool is_system_call () { return oldint !=3D ILLEGAL_SIG_FUNC_PTR; @@ -253,18 +255,27 @@ struct system_call_handle sigaddset (&child_block, SIGCHLD); sigprocmask (SIG_BLOCK, &child_block, &oldmask); sig_send (NULL, __SIGNOHOLD); + + cleanup_handler =3D { system_call_handle::cleanup, this, NULL }; + _pthread_cleanup_push (&cleanup_handler); } } ~system_call_handle () { if (is_system_call ()) + _pthread_cleanup_pop (1); + } + static void cleanup (void *arg) + { +# define this_ ((system_call_handle *) arg) + if (this_->is_system_call ()) { - signal (SIGINT, oldint); - signal (SIGQUIT, oldquit); - sigprocmask (SIG_SETMASK, &oldmask, NULL); + signal (SIGINT, this_->oldint); + signal (SIGQUIT, this_->oldquit); + sigprocmask (SIG_SETMASK, &(this_->oldmask), NULL); } } -# undef cleanup +# undef this_ }; =20 child_info_spawn NO_COPY ch_spawn;