Make GetConfigOption/GetConfigOptionResetString return "" for NULL.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 2 Nov 2023 15:53:36 +0000 (11:53 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 2 Nov 2023 15:53:36 +0000 (11:53 -0400)
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

src/backend/utils/misc/guc.c

index d6cd009f239798193aff826dd407d0616cbb440f..82d8efbc963be1e55e165310c7817141d0567671 100644 (file)
@@ -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,