git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ec741d4)
Fix pg_strtof() to not crash on NULL endptr.
Sat, 1 Mar 2025 19:22:56 +0000 (14:22 -0500)
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 <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


diff --git a/src/port/strtof.c b/src/port/strtof.c
index 7da05be687bb9f52277525a5f5a2a637d194d793..9ede9d297e6977314f063367dbb4cce6fd17699e 100644 (file)
--- 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);
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /