aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-connect.c28
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;
}