summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2023-11-02 15:53:36 +0000
committerTom Lane2023-11-02 15:53:36 +0000
commit0bc726d95a305ca923b1f284159f40f0d5cf5725 (patch)
treec5c8e1bd16dd70a7b2c0766949e8289416fa77db
parent7704a1a72e879daaefa1742916e01505edd2ce47 (diff)
Make GetConfigOption/GetConfigOptionResetString return "" for NULL.
As per the preceding commit, GUC APIs generally expose NULL-valued string variables as empty strings. Extend that policy to GetConfigOption() and GetConfigOptionResetString(), eliminating a crash hazard for unwary callers, as well as a fundamental ambiguity in GetConfigOption()'s API. No back-patch, since this is an API change and conceivably somebody somewhere is depending on this corner case. Xing Guo, Aleksander Alekseev, Tom Lane Discussion: https://postgr.es/m/CACpMh+AyDx5YUpPaAgzVwC1d8zfOL4JoD-uyFDnNSa1z0EsDQQ@mail.gmail.com
-rw-r--r--src/backend/utils/misc/guc.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d6cd009f23..82d8efbc96 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4215,8 +4215,7 @@ SetConfigOption(const char *name, const char *value,
/*
* Fetch the current value of the option `name', as a string.
*
- * If the option doesn't exist, return NULL if missing_ok is true (NOTE that
- * this cannot be distinguished from a string variable with a NULL value!),
+ * If the option doesn't exist, return NULL if missing_ok is true,
* otherwise throw an ereport and don't return.
*
* If restrict_privileged is true, we also enforce that only superusers and
@@ -4259,7 +4258,8 @@ GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged)
return buffer;
case PGC_STRING:
- return *((struct config_string *) record)->variable;
+ return *((struct config_string *) record)->variable ?
+ *((struct config_string *) record)->variable : "";
case PGC_ENUM:
return config_enum_lookup_by_value((struct config_enum *) record,
@@ -4306,7 +4306,8 @@ GetConfigOptionResetString(const char *name)
return buffer;
case PGC_STRING:
- return ((struct config_string *) record)->reset_val;
+ return ((struct config_string *) record)->reset_val ?
+ ((struct config_string *) record)->reset_val : "";
case PGC_ENUM:
return config_enum_lookup_by_value((struct config_enum *) record,