aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/misc/guc.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 4dde8196524..1683629ee38 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -7204,6 +7204,10 @@ set_config_option(const char *name, const char *value,
if (prohibitValueChange)
{
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
if (*conf->variable != newval)
{
record->status |= GUC_PENDING_RESTART;
@@ -7294,6 +7298,10 @@ set_config_option(const char *name, const char *value,
if (prohibitValueChange)
{
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
if (*conf->variable != newval)
{
record->status |= GUC_PENDING_RESTART;
@@ -7384,6 +7392,10 @@ set_config_option(const char *name, const char *value,
if (prohibitValueChange)
{
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
if (*conf->variable != newval)
{
record->status |= GUC_PENDING_RESTART;
@@ -7490,9 +7502,21 @@ set_config_option(const char *name, const char *value,
if (prohibitValueChange)
{
+ bool newval_different;
+
/* newval shouldn't be NULL, so we're a bit sloppy here */
- if (*conf->variable == NULL || newval == NULL ||
- strcmp(*conf->variable, newval) != 0)
+ newval_different = (*conf->variable == NULL ||
+ newval == NULL ||
+ strcmp(*conf->variable, newval) != 0);
+
+ /* Release newval, unless it's reset_val */
+ if (newval && !string_field_used(conf, newval))
+ free(newval);
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
+ if (newval_different)
{
record->status |= GUC_PENDING_RESTART;
ereport(elevel,
@@ -7587,6 +7611,10 @@ set_config_option(const char *name, const char *value,
if (prohibitValueChange)
{
+ /* Release newextra, unless it's reset_extra */
+ if (newextra && !extra_field_used(&conf->gen, newextra))
+ free(newextra);
+
if (*conf->variable != newval)
{
record->status |= GUC_PENDING_RESTART;