aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_ctl/pg_ctl.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index b70de712b61..71b608f3224 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -328,10 +328,14 @@ readfile(const char *path)
if (fd < 0)
return NULL;
if (fstat(fd, &statbuf) < 0)
+ {
+ close(fd);
return NULL;
+ }
if (statbuf.st_size == 0)
{
/* empty file */
+ close(fd);
result = (char **) pg_malloc(sizeof(char *));
*result = NULL;
return result;
@@ -347,14 +351,17 @@ readfile(const char *path)
return NULL;
}
- /* count newlines */
+ /*
+ * Count newlines. We expect there to be a newline after each full line,
+ * including one at the end of file. If there isn't a newline at the end,
+ * any characters after the last newline will be ignored.
+ */
nlines = 0;
- for (i = 0; i < len - 1; i++)
+ for (i = 0; i < len; i++)
{
if (buffer[i] == '\n')
nlines++;
}
- nlines++; /* account for the last line */
/* set up the result buffer */
result = (char **) pg_malloc((nlines + 1) * sizeof(char *));
@@ -364,7 +371,7 @@ readfile(const char *path)
n = 0;
for (i = 0; i < len; i++)
{
- if (buffer[i] == '\n' || i == len - 1)
+ if (buffer[i] == '\n')
{
int slen = &buffer[i] - linebegin + 1;
char *linebuf = pg_malloc(slen + 1);