Ensure BackgroundWorker struct contents are well-defined.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Apr 2017 03:23:44 +0000 (23:23 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Apr 2017 03:23:44 +0000 (23:23 -0400)
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.

src/backend/access/transam/parallel.c
src/backend/replication/logical/launcher.c
src/test/modules/test_shm_mq/setup.c
src/test/modules/worker_spi/worker_spi.c

index 04fa2ed455026eb02f73562daafb0c1a14f59595..2dad3e8a655e1e15cb1d6826d419e369a7d7029e 100644 (file)
@@ -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.
index 2d663f6308f627fb2c3f92f8f579bead120a3bba..35e9d0305f68a7deabdb27a295d7ac6a5219f716 100644 (file)
@@ -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;
index 319a67f49aa3ad9882ef222598cc684230026596..06c49bdb405da21fe7e7da894b13ba206a9dc905 100644 (file)
@@ -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;
index 421ec76ba36ba332677a45c98d2802e15e7771b7..9abfc714a997d7af26db101062152221033a0aa1 100644 (file)
@@ -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;