]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Make dsm_impl_posix_resize more future-proof.
authorThomas Munro <tmunro@postgresql.org>
Fri, 15 Jul 2022 22:59:52 +0000 (10:59 +1200)
committerThomas Munro <tmunro@postgresql.org>
Sat, 16 Jul 2022 00:23:43 +0000 (12:23 +1200)
Commit 4518c798 blocks signals for a short region of code, but it
assumed that whatever called it had the signal mask set to UnBlockSig on
entry.  That may be true today (or may even not be, in extensions in the
wild), but it would be better not to make that assumption.  We should
save-and-restore the caller's signal mask.

The PG_SETMASK() portability macro couldn't be used for that, which is
why it wasn't done before.  But... considering that commit a65e0864
established back in 9.6 that supported POSIX systems have sigprocmask(),
and that this is POSIX-only code, there is no reason not to use standard
sigprocmask() directly to achieve that.

Back-patch to all supported releases, like 4518c798 and 80845b7c.

Reviewed-by: Alvaro Herrera <alvherre@alvh.no-ip.org>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CA%2BhUKGKx6Biq7_UuV0kn9DW%2B8QWcpJC1qwhizdtD9tN-fn0H0g%40mail.gmail.com

src/backend/storage/ipc/dsm_impl.c

index 11d8f60103762d873372745b227c8af0b2277878..fb693487227c743e161ebb4707bbc7453fdf532b 100644 (file)
@@ -50,6 +50,7 @@
 #include "miscadmin.h"
 
 #include <fcntl.h>
+#include <signal.h>
 #include <unistd.h>
 #ifndef WIN32
 #include <sys/mman.h>
@@ -63,7 +64,7 @@
 #endif
 
 #include "common/file_perm.h"
-#include "libpq/pqsignal.h"            /* for PG_SETMASK macro */
+#include "libpq/pqsignal.h"
 #include "pgstat.h"
 #include "portability/mem.h"
 #include "storage/dsm_impl.h"
@@ -410,6 +411,7 @@ dsm_impl_posix_resize(int fd, off_t size)
 {
        int                     rc;
        int                     save_errno;
+       sigset_t        save_sigmask;
 
        /*
         * Block all blockable signals, except SIGQUIT.  posix_fallocate() can run
@@ -418,7 +420,7 @@ dsm_impl_posix_resize(int fd, off_t size)
         * conflicts), the retry loop might never succeed.
         */
        if (IsUnderPostmaster)
-               PG_SETMASK(&BlockSig);
+               sigprocmask(SIG_SETMASK, &BlockSig, &save_sigmask);
 
        /* Truncate (or extend) the file to the requested size. */
        do
@@ -459,7 +461,7 @@ dsm_impl_posix_resize(int fd, off_t size)
        if (IsUnderPostmaster)
        {
                save_errno = errno;
-               PG_SETMASK(&UnBlockSig);
+               sigprocmask(SIG_SETMASK, &save_sigmask, NULL);
                errno = save_errno;
        }