postgres.git / summary / log / commit / refs

commit    1d0fc2499ff2f7b81e1e2c742ccb587c48d0f6d6
Author:   Robert Haas <rhaas@postgresql.org>
Date:     Tue Dec 16 15:40:53 2025 +0000
First released in: 14.21, 15.16, 16.12, 17.8, 18.2

    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


src/backend/access/transam/parallel.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index d0ad0bd4280..2c07621d5cd 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -503,8 +503,12 @@ InitializeParallelDSM(ParallelContext *pcxt) void ReinitializeParallelDSM(ParallelContext *pcxt) { + MemoryContext oldcontext; FixedParallelState *fps; + /* We might be running in a very short-lived memory context. */ + oldcontext = MemoryContextSwitchTo(TopTransactionContext); + /* Wait for any old workers to exit. */ if (pcxt->nworkers_launched > 0) { @@ -542,6 +546,9 @@ ReinitializeParallelDSM(ParallelContext *pcxt) pcxt->worker[i].error_mqh = shm_mq_attach(mq, pcxt->seg, NULL); } } + + /* Restore previous memory context. */ + MemoryContextSwitchTo(oldcontext); } /* [parent: f5927da4ff6c]