aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-11-17 19:54:34 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-11-17 19:54:34 +0000
commitaed7855dd8e71e66c19128b1c052bf5132b3dd3e (patch)
tree54ce39c3041ad102ffbf851342b660e371e6162a
parentb990232c5d5447194857632522389142fcbb841d (diff)
downloadpostgresql-aed7855dd8e71e66c19128b1c052bf5132b3dd3e.tar.gz
postgresql-aed7855dd8e71e66c19128b1c052bf5132b3dd3e.zip
Fix off-by-one memory allocation, as reported by Rod Taylor. Also
avoid repalloc'ing twice when once is sufficient.
-rw-r--r--src/backend/libpq/hba.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c
index 6e36f5c5bcd..12c94a3db41 100644
--- a/src/backend/libpq/hba.c
+++ b/src/backend/libpq/hba.c
@@ -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));
}
}