mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08:00
Fix possible crash due to incorrect allocation context.
Commit af33039317
aimed to reduce
leakage from tqueue.c, which is good. Unfortunately, by changing the
memory context in which all of gather_readnext() executes, it also
changed the context in which ExecShutdownGatherWorkers executes, which
is not good, because that function eventually causes a call to
ExecParallelRetrieveInstrumentation, which proceeds to allocate
planstate->worker_instrument in a short-lived context, causing a
crash.
Rushabh Lathia, reviewed by Amit Kapila and by me.
This commit is contained in:
parent
a7b5573d66
commit
41fb35fabf
@ -500,6 +500,7 @@ ExecParallelRetrieveInstrumentation(PlanState *planstate,
|
||||
int n;
|
||||
int ibytes;
|
||||
int plan_node_id = planstate->plan->plan_node_id;
|
||||
MemoryContext oldcontext;
|
||||
|
||||
/* Find the instumentation for this node. */
|
||||
for (i = 0; i < instrumentation->num_plan_nodes; ++i)
|
||||
@ -514,10 +515,19 @@ ExecParallelRetrieveInstrumentation(PlanState *planstate,
|
||||
for (n = 0; n < instrumentation->num_workers; ++n)
|
||||
InstrAggNode(planstate->instrument, &instrument[n]);
|
||||
|
||||
/* Also store the per-worker detail. */
|
||||
/*
|
||||
* Also store the per-worker detail.
|
||||
*
|
||||
* Worker instrumentation should be allocated in the same context as
|
||||
* the regular instrumentation information, which is the per-query
|
||||
* context. Switch into per-query memory context.
|
||||
*/
|
||||
oldcontext = MemoryContextSwitchTo(planstate->state->es_query_cxt);
|
||||
ibytes = mul_size(instrumentation->num_workers, sizeof(Instrumentation));
|
||||
planstate->worker_instrument =
|
||||
palloc(ibytes + offsetof(WorkerInstrumentation, instrument));
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
|
||||
planstate->worker_instrument->num_workers = instrumentation->num_workers;
|
||||
memcpy(&planstate->worker_instrument->instrument, instrument, ibytes);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user