diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2025-03-01 14:22:56 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2025-03-01 14:22:56 -0500 |
commit | c7303f01c574c3543c68452c7dfd8998efe25085 (patch) | |
tree | 998d25ead2ee5d345ca4f9522a6279c33925e5c3 | |
parent | ec741d48036a4c021ea1071b1e7e42a4ff199c64 (diff) |
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 <exclusion@gmail.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/339b3902-4e98-4e31-a744-94e43b7b9292@gmail.com
Backpatch-through: 13
-rw-r--r-- | src/port/strtof.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/port/strtof.c b/src/port/strtof.c index 7da05be687b..9ede9d297e6 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); |