Fix array subscript warnings
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Thu, 30 Nov 2023 09:56:48 +0000 (10:56 +0100)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Thu, 30 Nov 2023 09:56:48 +0000 (10:56 +0100)
Commit a5cf808be55 accidentally passed signed chars to isalpha and
isspace in the parser code which leads to undefined behavior.  Fix
by casting the parameters to unsigned chars.

Author: Pavel Stehule <pavel.stehule@gmail.com>
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Reported-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/388186.1701315586@sss.pgh.pa.us
Discussion: https://postgr.es/m/ZWgg5xim2CXQcfmh@paquier.xyz

src/bin/pg_dump/filter.c

index dff871c7cd02675480920190bca4183548562ea7..d79b6da27c0d6451d7982ad87be6d54aa72a19a7 100644 (file)
@@ -185,14 +185,14 @@ filter_get_keyword(const char **line, int *size)
        *size = 0;
 
        /* Skip initial whitespace */
-       while (isspace(*ptr))
+       while (isspace((unsigned char) *ptr))
                ptr++;
 
-       if (isalpha(*ptr))
+       if (isalpha((unsigned char) *ptr))
        {
                result = ptr++;
 
-               while (isalpha(*ptr) || *ptr == '_')
+               while (isalpha((unsigned char) *ptr) || *ptr == '_')
                        ptr++;
 
                *size = ptr - result;
@@ -301,7 +301,7 @@ read_pattern(FilterStateData *fstate, const char *str, PQExpBuffer pattern)
        bool            found_space = false;
 
        /* Skip initial whitespace */
-       while (isspace(*str))
+       while (isspace((unsigned char) *str))
                str++;
 
        if (*str == '\0')
@@ -312,7 +312,7 @@ read_pattern(FilterStateData *fstate, const char *str, PQExpBuffer pattern)
 
        while (*str && *str != '#')
        {
-               while (*str && !isspace(*str) && !strchr("#,.()\"", *str))
+               while (*str && !isspace((unsigned char) *str) && !strchr("#,.()\"", *str))
                {
                        /*
                         * Append space only when it is allowed, and when it was found in
@@ -351,7 +351,7 @@ read_pattern(FilterStateData *fstate, const char *str, PQExpBuffer pattern)
                found_space = false;
 
                /* skip ending whitespaces */
-               while (isspace(*str))
+               while (isspace((unsigned char) *str))
                {
                        found_space = true;
                        str++;
@@ -400,7 +400,7 @@ filter_read_item(FilterStateData *fstate,
                fstate->lineno++;
 
                /* Skip initial white spaces */
-               while (isspace(*str))
+               while (isspace((unsigned char) *str))
                        str++;
 
                /*