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++;
 
        /*