Fix off-by-one memory allocation, as reported by Rod Taylor. Also

avoid repalloc'ing twice when once is sufficient.
This commit is contained in:
Tom Lane 2004-11-17 19:54:24 +00:00
parent 6444bc3535
commit edcaa8f691
1 changed files with 18 additions and 17 deletions

View File

@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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(""); char *comma_str = pstrdup("");
bool trailing_comma; bool trailing_comma;
char *incbuf; char *incbuf;
int needed;
do do
{ {
@ -239,16 +240,14 @@ next_token_expand(FILE *file)
else else
incbuf = pstrdup(buf); incbuf = pstrdup(buf);
comma_str = repalloc(comma_str, needed = strlen(comma_str) + strlen(incbuf) + 1;
strlen(comma_str) + strlen(incbuf) + 1); if (trailing_comma)
strcat(comma_str, incbuf); needed++;
pfree(incbuf); comma_str = repalloc(comma_str, needed);
strcat(comma_str, incbuf);
if (trailing_comma) if (trailing_comma)
{
comma_str = repalloc(comma_str, strlen(comma_str) + 1 + 1);
strcat(comma_str, MULTI_VALUE_SEP); strcat(comma_str, MULTI_VALUE_SEP);
} pfree(incbuf);
} while (trailing_comma); } while (trailing_comma);
return comma_str; return comma_str;
@ -327,7 +326,7 @@ tokenize_inc_file(const char *inc_filename)
pfree(inc_fullname); pfree(inc_fullname);
/* return empty string, it matches nothing */ /* return empty string, it matches nothing */
return pstrdup(""); return comma_str;
} }
pfree(inc_fullname); pfree(inc_fullname);
@ -335,7 +334,7 @@ tokenize_inc_file(const char *inc_filename)
tokenize_file(inc_file, &inc_lines, &inc_line_nums); tokenize_file(inc_file, &inc_lines, &inc_line_nums);
FreeFile(inc_file); FreeFile(inc_file);
/* Create comma-separate string from List */ /* Create comma-separated string from List */
foreach(line, inc_lines) foreach(line, inc_lines)
{ {
List *token_list = (List *) lfirst(line); List *token_list = (List *) lfirst(line);
@ -343,13 +342,15 @@ tokenize_inc_file(const char *inc_filename)
foreach(token, token_list) foreach(token, token_list)
{ {
if (strlen(comma_str)) int oldlen = strlen(comma_str);
{ int needed;
comma_str = repalloc(comma_str, strlen(comma_str) + 1);
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); strcat(comma_str, MULTI_VALUE_SEP);
}
comma_str = repalloc(comma_str,
strlen(comma_str) + strlen(lfirst(token)) + 1);
strcat(comma_str, lfirst(token)); strcat(comma_str, lfirst(token));
} }
} }