aboutsummaryrefslogtreecommitdiff
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
commit46b6f3fff0f11b22538d63f3711b206250bc6962 (patch)
treeec549c34249ae89f0ff2131db2c69a60073e72de
parent2cd311d4992cf57de832728cb9f84dc2efd802b7 (diff)
downloadpostgresql-46b6f3fff0f11b22538d63f3711b206250bc6962.tar.gz
postgresql-46b6f3fff0f11b22538d63f3711b206250bc6962.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>
-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 e9e49a950ba..0748c00ac9f 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -5753,18 +5753,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);