summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2017-04-17 03:23:44 +0000
committerTom Lane2017-04-17 03:23:44 +0000
commitb6dd1271281ce856ab774fc0b491a92878e3b501 (patch)
treeb18a6815271b38f83defd55390a30653697ed4bd
parentc7d225e227aa481c30532b2954055afd1705af31 (diff)
Ensure BackgroundWorker struct contents are well-defined.
Coverity complained because bgw.bgw_extra wasn't being filled in by ApplyLauncherRegister(). The most future-proof fix is to memset the whole BackgroundWorker struct to zeroes. While at it, let's apply the same coding rule to other places that set up BackgroundWorker structs; four out of five had the same or related issues.
-rw-r--r--src/backend/access/transam/parallel.c2
-rw-r--r--src/backend/replication/logical/launcher.c6
-rw-r--r--src/test/modules/test_shm_mq/setup.c1
-rw-r--r--src/test/modules/worker_spi/worker_spi.c2
4 files changed, 10 insertions, 1 deletions
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index 04fa2ed455..2dad3e8a65 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -435,6 +435,7 @@ LaunchParallelWorkers(ParallelContext *pcxt)
oldcontext = MemoryContextSwitchTo(TopTransactionContext);
/* Configure a worker. */
+ memset(&worker, 0, sizeof(worker));
snprintf(worker.bgw_name, BGW_MAXLEN, "parallel worker for PID %d",
MyProcPid);
worker.bgw_flags =
@@ -446,7 +447,6 @@ LaunchParallelWorkers(ParallelContext *pcxt)
sprintf(worker.bgw_function_name, "ParallelWorkerMain");
worker.bgw_main_arg = UInt32GetDatum(dsm_segment_handle(pcxt->seg));
worker.bgw_notify_pid = MyProcPid;
- memset(&worker.bgw_extra, 0, BGW_EXTRALEN);
/*
* Start workers.
diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c
index 2d663f6308..35e9d0305f 100644
--- a/src/backend/replication/logical/launcher.c
+++ b/src/backend/replication/logical/launcher.c
@@ -291,6 +291,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid,
LWLockRelease(LogicalRepWorkerLock);
/* Register the new dynamic worker. */
+ memset(&bgw, 0, sizeof(bgw));
bgw.bgw_flags = BGWORKER_SHMEM_ACCESS |
BGWORKER_BACKEND_DATABASE_CONNECTION;
bgw.bgw_start_time = BgWorkerStart_RecoveryFinished;
@@ -560,6 +561,10 @@ ApplyLauncherShmemSize(void)
return size;
}
+/*
+ * ApplyLauncherRegister
+ * Register a background worker running the logical replication launcher.
+ */
void
ApplyLauncherRegister(void)
{
@@ -568,6 +573,7 @@ ApplyLauncherRegister(void)
if (max_logical_replication_workers == 0)
return;
+ memset(&bgw, 0, sizeof(bgw));
bgw.bgw_flags = BGWORKER_SHMEM_ACCESS |
BGWORKER_BACKEND_DATABASE_CONNECTION;
bgw.bgw_start_time = BgWorkerStart_RecoveryFinished;
diff --git a/src/test/modules/test_shm_mq/setup.c b/src/test/modules/test_shm_mq/setup.c
index 319a67f49a..06c49bdb40 100644
--- a/src/test/modules/test_shm_mq/setup.c
+++ b/src/test/modules/test_shm_mq/setup.c
@@ -213,6 +213,7 @@ setup_background_workers(int nworkers, dsm_segment *seg)
PointerGetDatum(wstate));
/* Configure a worker. */
+ memset(&worker, 0, sizeof(worker));
worker.bgw_flags = BGWORKER_SHMEM_ACCESS;
worker.bgw_start_time = BgWorkerStart_ConsistentState;
worker.bgw_restart_time = BGW_NEVER_RESTART;
diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
index 421ec76ba3..9abfc714a9 100644
--- a/src/test/modules/worker_spi/worker_spi.c
+++ b/src/test/modules/worker_spi/worker_spi.c
@@ -343,6 +343,7 @@ _PG_init(void)
NULL);
/* set up common data for all our workers */
+ memset(&worker, 0, sizeof(worker));
worker.bgw_flags = BGWORKER_SHMEM_ACCESS |
BGWORKER_BACKEND_DATABASE_CONNECTION;
worker.bgw_start_time = BgWorkerStart_RecoveryFinished;
@@ -375,6 +376,7 @@ worker_spi_launch(PG_FUNCTION_ARGS)
BgwHandleStatus status;
pid_t pid;
+ memset(&worker, 0, sizeof(worker));
worker.bgw_flags = BGWORKER_SHMEM_ACCESS |
BGWORKER_BACKEND_DATABASE_CONNECTION;
worker.bgw_start_time = BgWorkerStart_RecoveryFinished;