From: Tom Lane Date: Mon, 17 Apr 2017 03:23:44 +0000 (-0400) Subject: Ensure BackgroundWorker struct contents are well-defined. X-Git-Tag: REL_10_BETA1~247 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b6dd1271281ce856ab774fc0b491a92878e3b501;p=thirdparty%2Fpostgresql.git 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. --- diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 04fa2ed4550..2dad3e8a655 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 2d663f6308f..35e9d0305f6 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 319a67f49aa..06c49bdb405 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 421ec76ba36..9abfc714a99 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;