Don't leak a signalfd when using latches in the postmaster.
authorThomas Munro <tmunro@postgresql.org>
Fri, 23 Dec 2022 07:24:41 +0000 (20:24 +1300)
committerThomas Munro <tmunro@postgresql.org>
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 <andres@anarazel.de>
Reviewed-by: Justin Pryzby <pryzby@telsasoft.com>
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);