mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03: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:
		@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user