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