Skip to content

Commit c58cf97

Browse files
committed
Fix failures to ignore \r when reading Windows-style newlines.
libpq failed to ignore Windows-style newlines in connection service files. This normally wasn't a problem on Windows itself, because fgets() would convert \r\n to just \n. But if libpq were running inside a program that changes the default fopen mode to binary, it would see the \r's and think they were data. In any case, it's project policy to ignore \r in text files unconditionally, because people sometimes try to use files with DOS-style newlines on Unix machines, where the C library won't hide that from us. Hence, adjust parseServiceFile() to ignore \r as well as \n at the end of the line. In HEAD, go a little further and make it ignore all trailing whitespace, to match what it's always done with leading whitespace. In HEAD, also run around and fix up everyplace where we have newline-chomping code to make all those places look consistent and uniformly drop \r. It is not clear whether any of those changes are fixing live bugs. Most of the non-cosmetic changes are in places that are reading popen output, and the jury is still out as to whether popen on Windows can return \r\n. (The Windows-specific code in pipe_read_line seems to think so, but our lack of support for this elsewhere suggests maybe it's not a problem in practice.) Hence, I desisted from applying those changes to back branches, except in run_ssl_passphrase_command() which is new enough and little-tested enough that we'd probably not have heard about any problems there. Tom Lane and Michael Paquier, per bug #15827 from Jorge Gustavo Rocha. Back-patch the parseServiceFile() change to all supported branches, and the run_ssl_passphrase_command() change to v11 where that was added. Discussion: https://postgr.es/m/15827-e6ba53a3a7ed543c@postgresql.org
1 parent 6e5417d commit c58cf97

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

src/backend/libpq/be-secure-common.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,10 @@ run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf,
112112
goto error;
113113
}
114114

115-
/* strip trailing newline */
115+
/* strip trailing newline, including \r in case we're on Windows */
116116
len = strlen(buf);
117-
if (len > 0 && buf[len - 1] == '\n')
117+
while (len > 0 && (buf[len - 1] == '\n' ||
118+
buf[len - 1] == '\r'))
118119
buf[--len] = '\0';
119120

120121
error:

src/interfaces/libpq/fe-connect.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5020,6 +5020,8 @@ parseServiceFile(const char *serviceFile,
50205020

50215021
while ((line = fgets(buf, sizeof(buf), f)) != NULL)
50225022
{
5023+
int len;
5024+
50235025
linenr++;
50245026

50255027
if (strlen(line) >= sizeof(buf) - 1)
@@ -5032,16 +5034,18 @@ parseServiceFile(const char *serviceFile,
50325034
return 2;
50335035
}
50345036

5035-
/* ignore EOL at end of line */
5036-
if (strlen(line) && line[strlen(line) - 1] == '\n')
5037-
line[strlen(line) - 1] = 0;
5037+
/* ignore EOL at end of line, including \r in case it's a DOS file */
5038+
len = strlen(line);
5039+
while (len > 0 && (line[len - 1] == '\n' ||
5040+
line[len - 1] == '\r'))
5041+
line[--len] = '\0';
50385042

50395043
/* ignore leading blanks */
50405044
while (*line && isspace((unsigned char) line[0]))
50415045
line++;
50425046

50435047
/* ignore comments and empty lines */
5044-
if (strlen(line) == 0 || line[0] == '#')
5048+
if (line[0] == '\0' || line[0] == '#')
50455049
continue;
50465050

50475051
/* Check for right groupname */

0 commit comments

Comments
 (0)