aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-11-15 16:17:19 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2016-11-15 16:17:19 -0500
commit0a7481930c788e9d74a154aac0c8b401fc6a81f9 (patch)
treee94a4a43e2e04fd6bd51d6c8722fd4934a9a4ba8 /src
parentffaa44cb559db332baeee7d25dedd74a61974203 (diff)
downloadpostgresql-0a7481930c788e9d74a154aac0c8b401fc6a81f9.tar.gz
postgresql-0a7481930c788e9d74a154aac0c8b401fc6a81f9.zip
Allow DOS-style line endings in ~/.pgpass files.
On Windows, libc will mask \r\n line endings for us, since we read the password file in text mode. But that doesn't happen on Unix. People who share password files across both systems might have \r\n line endings in a file they use on Unix, so as a convenience, ignore trailing \r. Per gripe from Josh Berkus. In passing, put the existing check for empty line somewhere where it's actually useful, ie after stripping the newline not before. Vik Fearing, adjusted a bit by me Discussion: <0de37763-5843-b2cc-855e-5d0e5df25807@agliodbs.com>
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-connect.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index b4f9ad72e59..ae85db9dd5a 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -6026,18 +6026,26 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
break;
len = strlen(buf);
- if (len == 0)
- continue;
/* Remove trailing newline */
- if (buf[len - 1] == '\n')
- buf[len - 1] = 0;
+ if (len > 0 && buf[len - 1] == '\n')
+ {
+ buf[--len] = '\0';
+ /* Handle DOS-style line endings, too, even when not on Windows */
+ if (len > 0 && buf[len - 1] == '\r')
+ buf[--len] = '\0';
+ }
+
+ if (len == 0)
+ continue;
if ((t = pwdfMatchesString(t, hostname)) == NULL ||
(t = pwdfMatchesString(t, port)) == NULL ||
(t = pwdfMatchesString(t, dbname)) == NULL ||
(t = pwdfMatchesString(t, username)) == NULL)
continue;
+
+ /* Found a match. */
ret = strdup(t);
fclose(fp);