From b3d2f9ba716d4e53f628367838192ae0aa93a382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20Ba=C5=9Fak?= Date: Fri, 11 Aug 2017 15:43:52 +0300 Subject: [PATCH 1/2] Fix pg_worker_list use-after-free bug This change fixes a use-after-free bug while renaming obsolete `pg_worker_list.conf` file, which causes Citus to crash during upgrade (or even extension creation) if `pg_worker_list.conf` exists. --- src/backend/distributed/utils/node_metadata.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/utils/node_metadata.c b/src/backend/distributed/utils/node_metadata.c index 0d68b96dc..cf7190d46 100644 --- a/src/backend/distributed/utils/node_metadata.c +++ b/src/backend/distributed/utils/node_metadata.c @@ -1367,14 +1367,14 @@ ParseWorkerNodeFileAndRename() workerNodeList = lappend(workerNodeList, workerNode); } - FreeFile(workerFileStream); - free(workerFilePath); - /* rename the file, marking that it is not used anymore */ appendStringInfo(renamedWorkerFilePath, "%s", workerFilePath); appendStringInfo(renamedWorkerFilePath, ".obsolete"); rename(workerFilePath, renamedWorkerFilePath->data); + FreeFile(workerFileStream); + free(workerFilePath); + return workerNodeList; } From 77626c4238dae8611bbf3510536071167c36f981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eren=20Ba=C5=9Fak?= Date: Mon, 14 Aug 2017 13:18:53 +0300 Subject: [PATCH 2/2] Fix NULL nodeClusterString crush on pg_worker_list.conf migrations --- src/backend/distributed/utils/node_metadata.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/utils/node_metadata.c b/src/backend/distributed/utils/node_metadata.c index cf7190d46..8c2ecc2ce 100644 --- a/src/backend/distributed/utils/node_metadata.c +++ b/src/backend/distributed/utils/node_metadata.c @@ -1424,7 +1424,17 @@ TupleToWorkerNode(TupleDesc tupleDescriptor, HeapTuple heapTuple) { Name nodeClusterName = DatumGetName(nodeCluster); char *nodeClusterString = NameStr(*nodeClusterName); - strlcpy(workerNode->nodeCluster, nodeClusterString, NAMEDATALEN); + + /* + * nodeClusterString can be null if nodecluster column is not present. + * In the case of extension creation/upgrade, master_initialize_node_metadata + * function is called before the nodecluster column is added to pg_dist_node + * table. + */ + if (nodeClusterString != NULL) + { + strlcpy(workerNode->nodeCluster, nodeClusterString, NAMEDATALEN); + } } return workerNode;