diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/libpq/fe-connect.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 80703698b81..3faf05a7e71 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -28,7 +28,6 @@ #include "fe-auth.h" #include "libpq-fe.h" #include "libpq-int.h" -#include "lib/stringinfo.h" #include "mb/pg_wchar.h" #include "pg_config_paths.h" #include "port/pg_bswap.h" @@ -5163,7 +5162,7 @@ parseServiceFile(const char *serviceFile, i; FILE *f; char *line; - StringInfoData linebuf; + char buf[1024]; *group_found = false; @@ -5175,18 +5174,26 @@ parseServiceFile(const char *serviceFile, return 1; } - initStringInfo(&linebuf); - - while (pg_get_line_buf(f, &linebuf)) + while ((line = fgets(buf, sizeof(buf), f)) != NULL) { + int len; + linenr++; - /* ignore whitespace at end of line, especially the newline */ - while (linebuf.len > 0 && - isspace((unsigned char) linebuf.data[linebuf.len - 1])) - linebuf.data[--linebuf.len] = '\0'; + if (strlen(line) >= sizeof(buf) - 1) + { + appendPQExpBuffer(errorMessage, + libpq_gettext("line %d too long in service file \"%s\"\n"), + linenr, + serviceFile); + result = 2; + goto exit; + } - line = linebuf.data; + /* ignore whitespace at end of line, especially the newline */ + len = strlen(line); + while (len > 0 && isspace((unsigned char) line[len - 1])) + line[--len] = '\0'; /* ignore leading whitespace too */ while (*line && isspace((unsigned char) line[0])) @@ -5303,7 +5310,6 @@ parseServiceFile(const char *serviceFile, exit: fclose(f); - pfree(linebuf.data); return result; } |