From: Tom Lane Date: Sat, 1 Mar 2025 19:22:56 +0000 (-0500) Subject: Fix pg_strtof() to not crash on NULL endptr. X-Git-Tag: REL_14_18~65 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=76fbb38ef69c9210b4ba839b541f7f307817294f;p=thirdparty%2Fpostgresql.git Fix pg_strtof() to not crash on NULL endptr. We had managed not to notice this simple oversight because none of our calls exercised the case --- until commit 8f427187d. That led to pg_dump crashing on any platform that uses this code (currently Cygwin and Mingw). Even though there's no immediate bug in the back branches, backpatch, because a non-POSIX-compliant strtof() substitute is trouble waiting to happen for extensions or future back-patches. Diagnosed-by: Alexander Lakhin Author: Tom Lane Discussion: https://postgr.es/m/339b3902-4e98-4e31-a744-94e43b7b9292@gmail.com Backpatch-through: 13 --- diff --git a/src/port/strtof.c b/src/port/strtof.c index 92bddfba40c..41ff8e23905 100644 --- a/src/port/strtof.c +++ b/src/port/strtof.c @@ -76,15 +76,18 @@ pg_strtof(const char *nptr, char **endptr) { int caller_errno = errno; float fresult; + char *myendptr; errno = 0; - fresult = (strtof) (nptr, endptr); + fresult = (strtof) (nptr, &myendptr); + if (endptr) + *endptr = myendptr; if (errno) { /* On error, just return the error to the caller. */ return fresult; } - else if ((*endptr == nptr) || isnan(fresult) || + else if ((myendptr == nptr) || isnan(fresult) || ((fresult >= FLT_MIN || fresult <= -FLT_MIN) && !isinf(fresult))) { /* @@ -98,7 +101,8 @@ pg_strtof(const char *nptr, char **endptr) else { /* - * Try again. errno is already 0 here. + * Try again. errno is already 0 here, and we assume that the endptr + * won't be any different. */ double dresult = strtod(nptr, NULL);