postgres.git / summary / log / commit / refs

commit    8951f92da48cb2866b9f694e91f57eeaac7489bb
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Tue Nov 15 21:17:19 2016 +0000

    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>


src/interfaces/libpq/fe-connect.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index a1c7a9672a6..df223255592 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -5767,18 +5767,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); [parent: 0bc3ed98c08d]