public inbox for glibc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently @ 2023-02-24 15:25 ayi at janestreet dot com 2023-02-24 15:43 ` [Bug libc/30163] " ayi at janestreet dot com ` (5 more replies) 0 siblings, 6 replies; 7+ messages in thread From: ayi at janestreet dot com @ 2023-02-24 15:25 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 Bug ID: 30163 Summary: system() erroneously block SIGCHLD forever when called concurrently Product: glibc Version: 2.29 Status: UNCONFIRMED Severity: normal Priority: P2 Component: libc Assignee: unassigned at sourceware dot org Reporter: ayi at janestreet dot com CC: drepper.fsp at gmail dot com Target Milestone: --- Created attachment 14718 --> https://sourceware.org/bugzilla/attachment.cgi?id=14718&action=edit Reproduction code Description ----------- Although POSIX does not require, glibc system implementation aims to be thread and cancellation safe. However, I found that commit 5fb7fc96350575c9adb1316833e48ca11553be49 introduced a concurrency bug. Specifically, in the following scenario with two threads in the same process: 1. Thread A calls system but hasn't returned yet 2. Thread B calls another system but returns I observed that SIGCHLD would be blocked forever in thread B after its system() returns, even after the system() in thread A returns (though I believe it should unblock it after system() in thread B returns). Analysis -------- We always block SIGCHLD and store original signal mask in omask before calling posix_spawn: ``` // ... __sigemptyset (&sa.sa_mask); // ... __sigaddset (&sa.sa_mask, SIGCHLD); /* sigprocmask can not fail with SIG_BLOCK used with valid input arguments. */ __sigprocmask (SIG_BLOCK, &sa.sa_mask, &omask); // ... __posix_spawnattr_setsigmask (&spawn_attr, &omask); ``` However, when it comes to restoring to omask in parent process, the code previously looks like this: ``` DO_LOCK (); if ((SUB_REF () == 0 && (__sigaction (SIGINT, &intr, (struct sigaction *) NULL) | __sigaction (SIGQUIT, &quit, (struct sigaction *) NULL)) != 0) || __sigprocmask (SIG_SETMASK, &omask, (sigset_t *) NULL) != 0) { #ifndef _LIBC /* glibc cannot be used on systems without waitpid. */ if (errno == ENOSYS) __set_errno (save); else #endif status = -1; } DO_UNLOCK (); ``` The aforementioned buggy commit changed it to this: ``` DO_LOCK (); if (SUB_REF () == 0) { /* sigaction can not fail with SIGINT/SIGQUIT used with old disposition. Same applies for sigprocmask. */ __sigaction (SIGINT, &intr, NULL); __sigaction (SIGQUIT, &quit, NULL); __sigprocmask (SIG_SETMASK, &omask, NULL); } DO_UNLOCK (); ``` Previously we would unconditionally revert mask back to omask but only call sigaction if it's the last one (since that's shared for the whole process); now we also only revert if it's the last ongoing system, despite that signal mask is per-thread. Fix --- I believe we should move the last `__sigprocmask` out of this if statement. I already have a patch ready and will send it over later today. Reproduction ------------ I've attached a simple C reproduction program to this bug. It doesn't print anything on releases/2.28/master (before introducing the bug) but prints "SIGCHLD is erroneously blocked" on releases/2.29/master and on latest master branch. -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libc/30163] system() erroneously block SIGCHLD forever when called concurrently 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com @ 2023-02-24 15:43 ` ayi at janestreet dot com 2023-02-24 16:29 ` ayi at janestreet dot com ` (4 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: ayi at janestreet dot com @ 2023-02-24 15:43 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 Adam Yi <ayi at janestreet dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ayi at janestreet dot com -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libc/30163] system() erroneously block SIGCHLD forever when called concurrently 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com 2023-02-24 15:43 ` [Bug libc/30163] " ayi at janestreet dot com @ 2023-02-24 16:29 ` ayi at janestreet dot com 2023-02-24 16:30 ` ayi at janestreet dot com ` (3 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: ayi at janestreet dot com @ 2023-02-24 16:29 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 --- Comment #1 from Adam Yi <ayi at janestreet dot com> --- Created attachment 14720 --> https://sourceware.org/bugzilla/attachment.cgi?id=14720&action=edit Proposed patch -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libc/30163] system() erroneously block SIGCHLD forever when called concurrently 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com 2023-02-24 15:43 ` [Bug libc/30163] " ayi at janestreet dot com 2023-02-24 16:29 ` ayi at janestreet dot com @ 2023-02-24 16:30 ` ayi at janestreet dot com 2023-02-24 17:02 ` adhemerval.zanella at linaro dot org ` (2 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: ayi at janestreet dot com @ 2023-02-24 16:30 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 Adam Yi <ayi at janestreet dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |adhemerval.zanella at linaro dot o | |rg -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libc/30163] system() erroneously block SIGCHLD forever when called concurrently 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com ` (2 preceding siblings ...) 2023-02-24 16:30 ` ayi at janestreet dot com @ 2023-02-24 17:02 ` adhemerval.zanella at linaro dot org 2023-02-24 17:14 ` ayi at janestreet dot com 2023-03-09 2:51 ` ayi at janestreet dot com 5 siblings, 0 replies; 7+ messages in thread From: adhemerval.zanella at linaro dot org @ 2023-02-24 17:02 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 --- Comment #2 from Adhemerval Zanella <adhemerval.zanella at linaro dot org> --- Can you send the patch to libc-alpha? All development is done there, along with patch reviews and discussions. -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libc/30163] system() erroneously block SIGCHLD forever when called concurrently 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com ` (3 preceding siblings ...) 2023-02-24 17:02 ` adhemerval.zanella at linaro dot org @ 2023-02-24 17:14 ` ayi at janestreet dot com 2023-03-09 2:51 ` ayi at janestreet dot com 5 siblings, 0 replies; 7+ messages in thread From: ayi at janestreet dot com @ 2023-02-24 17:14 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 --- Comment #3 from Adam Yi <ayi at janestreet dot com> --- (In reply to Adhemerval Zanella from comment #2) > Can you send the patch to libc-alpha? All development is done there, along > with patch reviews and discussions. Will do, thanks! -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libc/30163] system() erroneously block SIGCHLD forever when called concurrently 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com ` (4 preceding siblings ...) 2023-02-24 17:14 ` ayi at janestreet dot com @ 2023-03-09 2:51 ` ayi at janestreet dot com 5 siblings, 0 replies; 7+ messages in thread From: ayi at janestreet dot com @ 2023-03-09 2:51 UTC (permalink / raw) To: glibc-bugs https://sourceware.org/bugzilla/show_bug.cgi?id=30163 Adam Yi <ayi at janestreet dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |FIXED Status|UNCONFIRMED |RESOLVED --- Comment #4 from Adam Yi <ayi at janestreet dot com> --- Fixed by 436a604b7dc741fc76b5a6704c6cd8bb178518e7 -- You are receiving this mail because: You are on the CC list for the bug. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-03-09 2:51 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-02-24 15:25 [Bug libc/30163] New: system() erroneously block SIGCHLD forever when called concurrently ayi at janestreet dot com 2023-02-24 15:43 ` [Bug libc/30163] " ayi at janestreet dot com 2023-02-24 16:29 ` ayi at janestreet dot com 2023-02-24 16:30 ` ayi at janestreet dot com 2023-02-24 17:02 ` adhemerval.zanella at linaro dot org 2023-02-24 17:14 ` ayi at janestreet dot com 2023-03-09 2:51 ` ayi at janestreet dot com
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).