From e04bb261633dd76d6dc2e250c92f33330ec2891e 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 cbdcdfe0423..8265f53f41c 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -5218,6 +5218,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