From 04aa34da68e1f05f6ec4a65a0ae090b672b1d68e Mon Sep 17 00:00:00 2001 From: Jason Petersen Date: Sun, 17 Mar 2019 23:07:11 -0600 Subject: [PATCH] Invalidate ConnParamsHash at config reload At configuration reload, we free all "global" (i.e. GUC-set) connection parameters, but these may still have live references in the connection parameters hash. By marking the entries as invalid, we can ensure they will not be used after free. --- .../connection/connection_configuration.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/backend/distributed/connection/connection_configuration.c b/src/backend/distributed/connection/connection_configuration.c index 86f5ebcf6..c6331e935 100644 --- a/src/backend/distributed/connection/connection_configuration.c +++ b/src/backend/distributed/connection/connection_configuration.c @@ -77,16 +77,27 @@ void ResetConnParams() { Index paramIdx = 0; - for (paramIdx = 0; paramIdx < ConnParams.size; paramIdx++) { - /* FIXME: People still have references to these! */ free((void *) ConnParams.keywords[paramIdx]); free((void *) ConnParams.values[paramIdx]); ConnParams.keywords[paramIdx] = ConnParams.values[paramIdx] = NULL; } + if (ConnParamsHash != NULL) + { + ConnParamsHashEntry *entry = NULL; + HASH_SEQ_STATUS status; + + hash_seq_init(&status, ConnParamsHash); + while ((entry = (ConnParamsHashEntry *) hash_seq_search(&status)) != NULL) + { + entry->isValid = false; + } + } + + ConnParams.size = 0; AddConnParam("fallback_application_name", "citus");