diff options
author | Tom Lane | 2023-11-02 15:53:36 +0000 |
---|---|---|
committer | Tom Lane | 2023-11-02 15:53:36 +0000 |
commit | 0bc726d95a305ca923b1f284159f40f0d5cf5725 (patch) | |
tree | c5c8e1bd16dd70a7b2c0766949e8289416fa77db | |
parent | 7704a1a72e879daaefa1742916e01505edd2ce47 (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.c | 9 |
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, |