aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2022-07-16 10:59:52 +1200
committerThomas Munro <tmunro@postgresql.org>2022-07-16 12:22:42 +1200
commit3b8d23a3e14f05890f1f306902cd4b992beeee71 (patch)
tree6575f8bfc4d23055e240116832903956a0f756ef /src
parent3a0e385048adf84d212e010d82db16228e5f4060 (diff)
downloadpostgresql-3b8d23a3e14f05890f1f306902cd4b992beeee71.tar.gz
postgresql-3b8d23a3e14f05890f1f306902cd4b992beeee71.zip
Make dsm_impl_posix_resize more future-proof.
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/ipc/dsm_impl.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c
index 0247d13a913..69c6df75b48 100644
--- a/src/backend/storage/ipc/dsm_impl.c
+++ b/src/backend/storage/ipc/dsm_impl.c
@@ -49,6 +49,7 @@
#include "postgres.h"
#include <fcntl.h>
+#include <signal.h>
#include <unistd.h>
#ifndef WIN32
#include <sys/mman.h>
@@ -62,7 +63,7 @@
#endif
#include "common/file_perm.h"
-#include "libpq/pqsignal.h" /* for PG_SETMASK macro */
+#include "libpq/pqsignal.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "portability/mem.h"
@@ -355,6 +356,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
@@ -363,7 +365,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);
pgstat_report_wait_start(WAIT_EVENT_DSM_ALLOCATE);
#if defined(HAVE_POSIX_FALLOCATE) && defined(__linux__)
@@ -402,7 +404,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;
}