1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-18 05:01:01 +03:00

Switch memory contexts in ReinitializeParallelDSM.

We already do this in CreateParallelContext, InitializeParallelDSM, and
LaunchParallelWorkers. I suspect the reason why the matching logic was
omitted from ReinitializeParallelDSM is that I failed to realize that
any memory allocation was happening here -- but shm_mq_attach does
allocate, which could result in a shm_mq_handle being allocated in a
shorter-lived context than the ParallelContext which points to it.

That could result in a crash if the shorter-lived context is freed
before the parallel context is destroyed. As far as I am currently
aware, there is no way to reach a crash using only code that is
present in core PostgreSQL, but extensions could potentially trip
over this. Fixing this in the back-branches appears low-risk, so
back-patch to all supported versions.

Author: Jakub Wartak <jakub.wartak@enterprisedb.com>
Co-authored-by: Jeevan Chalke <jeevan.chalke@enterprisedb.com>
Backpatch-through: 14
Discussion: http://postgr.es/m/CAKZiRmwfVripa3FGo06=5D1EddpsLu9JY2iJOTgbsxUQ339ogQ@mail.gmail.com
This commit is contained in:
Robert Haas
2025-12-16 10:40:53 -05:00
parent 462e247652
commit f1a6e622bd

View File

@@ -508,8 +508,12 @@ InitializeParallelDSM(ParallelContext *pcxt)
void void
ReinitializeParallelDSM(ParallelContext *pcxt) ReinitializeParallelDSM(ParallelContext *pcxt)
{ {
MemoryContext oldcontext;
FixedParallelState *fps; FixedParallelState *fps;
/* We might be running in a very short-lived memory context. */
oldcontext = MemoryContextSwitchTo(TopTransactionContext);
/* Wait for any old workers to exit. */ /* Wait for any old workers to exit. */
if (pcxt->nworkers_launched > 0) if (pcxt->nworkers_launched > 0)
{ {
@@ -547,6 +551,9 @@ ReinitializeParallelDSM(ParallelContext *pcxt)
pcxt->worker[i].error_mqh = shm_mq_attach(mq, pcxt->seg, NULL); pcxt->worker[i].error_mqh = shm_mq_attach(mq, pcxt->seg, NULL);
} }
} }
/* Restore previous memory context. */
MemoryContextSwitchTo(oldcontext);
} }
/* /*