From 227d57f3587d7d2a7d0792011f5ac952ba763681 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Wed, 30 Sep 2015 18:36:31 -0400
Subject: [PATCH] Don't dump core when destroying an unused ParallelContext.

If a transaction or subtransaction creates a ParallelContext but ends
without calling InitializeParallelDSM, the previous code would
seg fault.  Fix that.
---
 src/backend/access/transam/parallel.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index f4ba8518b12..29d6ed57cc2 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -513,14 +513,17 @@ DestroyParallelContext(ParallelContext *pcxt)
 	dlist_delete(&pcxt->node);
 
 	/* Kill each worker in turn, and forget their error queues. */
-	for (i = 0; i < pcxt->nworkers; ++i)
+	if (pcxt->worker != NULL)
 	{
-		if (pcxt->worker[i].bgwhandle != NULL)
-			TerminateBackgroundWorker(pcxt->worker[i].bgwhandle);
-		if (pcxt->worker[i].error_mqh != NULL)
+		for (i = 0; i < pcxt->nworkers; ++i)
 		{
-			pfree(pcxt->worker[i].error_mqh);
-			pcxt->worker[i].error_mqh = NULL;
+			if (pcxt->worker[i].bgwhandle != NULL)
+				TerminateBackgroundWorker(pcxt->worker[i].bgwhandle);
+			if (pcxt->worker[i].error_mqh != NULL)
+			{
+				pfree(pcxt->worker[i].error_mqh);
+				pcxt->worker[i].error_mqh = NULL;
+			}
 		}
 	}
 
@@ -550,7 +553,7 @@ DestroyParallelContext(ParallelContext *pcxt)
 	{
 		BgwHandleStatus status;
 
-		if (pcxt->worker[i].bgwhandle == NULL)
+		if (pcxt->worker == NULL || pcxt->worker[i].bgwhandle == NULL)
 			continue;
 
 		/*
-- 
GitLab