Don't leak a signalfd when using latches in the postmaster.
authorThomas Munro <[email protected]>
Fri, 23 Dec 2022 07:24:41 +0000 (20:24 +1300)
committerThomas Munro <[email protected]>
Fri, 23 Dec 2022 07:24:41 +0000 (20:24 +1300)
At the time of commit 6a2a70a02 we didn't use latch infrastructure in
the postmaster.  We're planning to start doing that, so we'd better make
sure that the signalfd inherited from a postmaster is not duplicated and
then leaked in the child.

Reviewed-by: Andres Freund <[email protected]>
Reviewed-by: Justin Pryzby <[email protected]>
Discussion: https://postgr.es/m/CA%2BhUKG%2BZ-HpOj1JsO9eWUP%2Bar7npSVinsC_npxSy%2BjdOMsx%3DGg%40mail.gmail.com

src/backend/storage/ipc/latch.c

index 7ced8264f00b82ff642196063c7ce5807d556acb..b32c96b63d3b41eee1d73df9d7e2764f429207f7 100644 (file)
@@ -283,6 +283,22 @@ InitializeLatchSupport(void)
 #ifdef WAIT_USE_SIGNALFD
        sigset_t        signalfd_mask;
 
+       if (IsUnderPostmaster)
+       {
+               /*
+                * It would probably be safe to re-use the inherited signalfd since
+                * signalfds only see the current process's pending signals, but it
+                * seems less surprising to close it and create our own.
+                */
+               if (signal_fd != -1)
+               {
+                       /* Release postmaster's signal FD; ignore any error */
+                       (void) close(signal_fd);
+                       signal_fd = -1;
+                       ReleaseExternalFD();
+               }
+       }
+
        /* Block SIGURG, because we'll receive it through a signalfd. */
        sigaddset(&UnBlockSig, SIGURG);