From 521e8888e98b24a9d5787a1848360c7286463e1a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 9 Jan 2005 21:03:19 +0000
Subject: [PATCH] Undo an unadvertised change in the API of pg_atoi.  In all
 previous releases, a nonzero 'c' argument meant that the input string could
 be terminated by either that character or \0.  Recent refactoring broke that,
 causing the thing to scan for 'c' only.  This went undetected because no part
 of the main code actually passes nonzero 'c'.  However it broke tsearch2 and
 possibly other user-written code that assumed the old definition.  Per report
 from Tom Hebbron.

---
 src/backend/utils/adt/numutils.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c
index 3b0d000365a..fb7fd94b8c8 100644
--- a/src/backend/utils/adt/numutils.c
+++ b/src/backend/utils/adt/numutils.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/numutils.c,v 1.67 2004/12/31 22:01:22 pgsql Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/numutils.c,v 1.68 2005/01/09 21:03:19 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -46,12 +46,12 @@
 /*
  * pg_atoi: convert string to integer
  *
- * 'size' is the sizeof() the desired integral result (1, 2, or 4 bytes).
- *
  * allows any number of leading or trailing whitespace characters.
  *
- * 'c' is the character that terminates the input string (after any
- * number of whitespace characters).
+ * 'size' is the sizeof() the desired integral result (1, 2, or 4 bytes).
+ *
+ * c, if not 0, is a terminator character that may appear after the
+ * integer (plus whitespace).  If 0, the string must end after the integer.
  *
  * Unlike plain atoi(), this will throw ereport() upon bad input format or
  * overflow.
@@ -88,10 +88,10 @@ pg_atoi(char *s, int size, int c)
 	 * Skip any trailing whitespace; if anything but whitespace remains
 	 * before the terminating character, bail out
 	 */
-	while (*badp != c && isspace((unsigned char) *badp))
+	while (*badp && *badp != c && isspace((unsigned char) *badp))
 		badp++;
 
-	if (*badp != c)
+	if (*badp && *badp != c)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
 				 errmsg("invalid input syntax for integer: \"%s\"",
-- 
GitLab