Commit 786b1802 authored by Bruce Momjian's avatar Bruce Momjian

The pg_atoi() function uses strtol() to convert the string to numbers. Some

implementations of strtol() treat empty strings ("") as invalid arguments
while others convert this (erroneously, IHMO) to zero (0).  Assuming that the
expected behaviour of pg_atoi() is to return 0 if it is passed an empty
string, I am supplying the following patch to explictly check for an empty
string in pg_atoi() and return 0 if the string is empty.  The patch will also
trap a NULL character pointer being passed to pg_atoi() and will use elog() to
print out an error message if the input char pointer is NULL.


Billy G. Allie
parent 5f7fb677
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v 1.26 1998/09/01 04:32:43 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v 1.27 1998/09/12 16:04:35 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -55,8 +55,19 @@ pg_atoi(char *s, int size, int c) ...@@ -55,8 +55,19 @@ pg_atoi(char *s, int size, int c)
Assert(s); Assert(s);
errno = 0; errno = 0;
l = strtol(s, &badp, 10);
/*
* Some versions of strtol treat the empty string as an error. This
* code will explicitly return 0 for an empty string.
*/
if (s == (char *)NULL)
elog(ERROR, "pg_atoi: NULL pointer!");
else if (*s == 0)
l = (long)0;
else
l = strtol(s, &badp, 10);
if (errno) /* strtol must set ERANGE */ if (errno) /* strtol must set ERANGE */
elog(ERROR, "pg_atoi: error reading \"%s\": %m", s); elog(ERROR, "pg_atoi: error reading \"%s\": %m", s);
if (badp && *badp && (*badp != c)) if (badp && *badp && (*badp != c))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment