Fix pg_strtof() to not crash on NULL endptr.
authorTom Lane <[email protected]>
Sat, 1 Mar 2025 19:22:56 +0000 (14:22 -0500)
committerTom Lane <[email protected]>
Sat, 1 Mar 2025 19:22:56 +0000 (14:22 -0500)
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 <[email protected]>
Author: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/339b3902-4e98-4e31-a744-94e43b7b9292@gmail.com
Backpatch-through: 13

src/port/strtof.c

index 2a5553bc5fe83f460cca1e17c2ac86cfc5f0acb4..acd833267a06521269b05b3d2affc1db1236ea5d 100644 (file)
@@ -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);