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:34 +0000 (19:54 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Nov 2004 19:54:34 +0000 (19:54 +0000)
avoid repalloc'ing twice when once is sufficient.

src/backend/libpq/hba.c

index 6e36f5c5bcd472bc2ce5c5450b7d3d7087cd694a..12c94a3db41be93ef78af442b7fddf4fa867b047 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.116.2.3 2004/09/18 01:23:12 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.116.2.4 2004/11/17 19:54:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -179,6 +179,7 @@ next_token_expand(FILE *file)
    char       *comma_str = pstrdup("");
    bool        trailing_comma;
    char       *incbuf;
+   int         needed;
 
    do
    {
@@ -200,16 +201,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;
@@ -270,7 +269,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);
 
@@ -278,7 +277,7 @@ tokenize_inc_file(const char *inc_filename)
    inc_lines = tokenize_file(inc_file);
    FreeFile(inc_file);
 
-   /* Create comma-separate string from List */
+   /* Create comma-separated string from List */
    foreach(line, inc_lines)
    {
        List       *ln = lfirst(line);
@@ -287,13 +286,15 @@ tokenize_inc_file(const char *inc_filename)
        /* First entry is line number */
        foreach(token, lnext(ln))
        {
-           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));
        }
    }