Fix off-by-one memory allocation, as reported by Rod Taylor. Also
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Nov 2004 19:54:24 +0000 (19:54 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Nov 2004 19:54:24 +0000 (19:54 +0000)
avoid repalloc'ing twice when once is sufficient.

src/backend/libpq/hba.c

index c27983e794c0c62d21b7ef41e203b4607195509c..40ff28059a4773c6d98498efba9c106cdaa5fff2 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.133 2004/10/12 21:54:38 petere Exp $
+ *   $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.134 2004/11/17 19:54:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -218,6 +218,7 @@ next_token_expand(FILE *file)
    char       *comma_str = pstrdup("");
    bool        trailing_comma;
    char       *incbuf;
+   int         needed;
 
    do
    {
@@ -239,16 +240,14 @@ next_token_expand(FILE *file)
        else
            incbuf = pstrdup(buf);
 
-       comma_str = repalloc(comma_str,
-                            strlen(comma_str) + strlen(incbuf) + 1);
+       needed = strlen(comma_str) + strlen(incbuf) + 1;
+       if (trailing_comma)
+           needed++;
+       comma_str = repalloc(comma_str, needed);
        strcat(comma_str, incbuf);
-       pfree(incbuf);
-
        if (trailing_comma)
-       {
-           comma_str = repalloc(comma_str, strlen(comma_str) + 1 + 1);
            strcat(comma_str, MULTI_VALUE_SEP);
-       }
+       pfree(incbuf);
    } while (trailing_comma);
 
    return comma_str;
@@ -327,7 +326,7 @@ tokenize_inc_file(const char *inc_filename)
        pfree(inc_fullname);
 
        /* return empty string, it matches nothing */
-       return pstrdup("");
+       return comma_str;
    }
    pfree(inc_fullname);
 
@@ -335,7 +334,7 @@ tokenize_inc_file(const char *inc_filename)
    tokenize_file(inc_file, &inc_lines, &inc_line_nums);
    FreeFile(inc_file);
 
-   /* Create comma-separate string from List */
+   /* Create comma-separated string from List */
    foreach(line, inc_lines)
    {
        List       *token_list = (List *) lfirst(line);
@@ -343,13 +342,15 @@ tokenize_inc_file(const char *inc_filename)
 
        foreach(token, token_list)
        {
-           if (strlen(comma_str))
-           {
-               comma_str = repalloc(comma_str, strlen(comma_str) + 1);
+           int     oldlen = strlen(comma_str);
+           int     needed;
+
+           needed = oldlen + strlen(lfirst(token)) + 1;
+           if (oldlen > 0)
+               needed++;
+           comma_str = repalloc(comma_str, needed);
+           if (oldlen > 0)
                strcat(comma_str, MULTI_VALUE_SEP);
-           }
-           comma_str = repalloc(comma_str,
-                         strlen(comma_str) + strlen(lfirst(token)) + 1);
            strcat(comma_str, lfirst(token));
        }
    }