From 5aafedc2fdbdbe4efcb749b0f20a925436d18d06 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 10 Mar 2019 12:58:52 -0400 Subject: Disallow NaN as a value for floating-point GUCs. None of the code that uses GUC values is really prepared for them to hold NaN, but parse_real() didn't have any defense against accepting such a value. Treat it the same as a syntax error. I haven't attempted to analyze the exact consequences of setting any of the float GUCs to NaN, but since they're quite unlikely to be good, this seems like a back-patchable bug fix. Note: we don't need an explicit test for +-Infinity because those will be rejected by existing range checks. I added a regression test for that in HEAD, but not older branches because the spelling of the value in the error message will be platform-dependent in branches where we don't always use port/snprintf.c. Discussion: https://postgr.es/m/1798.1552165479@sss.pgh.pa.us --- src/backend/utils/misc/guc.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/backend/utils/misc/guc.c') diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index ec83d1dd456..dc1bfc32ee1 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -5503,6 +5503,10 @@ parse_real(const char *value, double *result) if (endptr == value || errno == ERANGE) return false; + /* reject NaN (infinities will fail range checks later) */ + if (isnan(val)) + return false; + /* allow whitespace after number */ while (isspace((unsigned char) *endptr)) endptr++; -- cgit v1.2.3