diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-11-17 19:54:24 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-11-17 19:54:24 +0000 |
commit | edcaa8f691764efdf2a2e6849489aaf8bf153a83 (patch) | |
tree | 4d574689941eaf495d0585aa7ed6740b4fd61677 | |
parent | 6444bc35357db9ce16af8584d7baaa30e510724b (diff) | |
download | postgresql-edcaa8f691764efdf2a2e6849489aaf8bf153a83.tar.gz postgresql-edcaa8f691764efdf2a2e6849489aaf8bf153a83.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.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index c27983e794c..40ff28059a4 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -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)); } } |