From ebe919e95336cbe0a0b5078189e1525bfb038385 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 1 Mar 2025 14:22:56 -0500
Subject: [PATCH] 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
---
 src/port/strtof.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/port/strtof.c b/src/port/strtof.c
index 2a5553bc5fe..acd833267a0 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);
 
-- 
2.39.5