diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-30 19:49:54 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-30 19:49:54 +0000 |
commit | 4ec457ad581fff37dda7739ac61d6912c6538e48 (patch) | |
tree | 8b0e63c400082dc102a0755e76f8f4e486774614 /src | |
parent | 887edf4ff75b976020ff4880f7286db4737e1293 (diff) | |
download | postgresql-4ec457ad581fff37dda7739ac61d6912c6538e48.tar.gz postgresql-4ec457ad581fff37dda7739ac61d6912c6538e48.zip |
Fix regression in .pgpass support. From Neil Conway.
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/libpq/fe-connect.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 57108df1ff8..a3368a83b55 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.221 2003/01/08 21:33:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.222 2003/01/30 19:49:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -123,7 +123,7 @@ static const PQconninfoOption PQconninfoOptions[] = { "Database-Password", "*", 20}, {"connect_timeout", "PGCONNECT_TIMEOUT", NULL, NULL, - "Connect-timeout", "", 10}, /* strlen( INT32_MAX) == 10 */ + "Connect-timeout", "", 10}, /* strlen(INT32_MAX) == 10 */ {"dbname", "PGDATABASE", NULL, NULL, "Database-Name", "", 20}, @@ -315,8 +315,14 @@ PQconnectStart(const char *conninfo) tmp = conninfo_getval(connOptions, "password"); conn->pgpass = tmp ? strdup(tmp) : NULL; if (conn->pgpass == NULL || conn->pgpass[0] == '\0') + { + if (conn->pgpass) + free(conn->pgpass); conn->pgpass = PasswordFromFile(conn->pghost, conn->pgport, - conn->dbName, conn->pguser); + conn->dbName, conn->pguser); + if (conn->pgpass == NULL) + conn->pgpass = strdup(DefaultPassword); + } tmp = conninfo_getval(connOptions, "connect_timeout"); conn->connect_timeout = tmp ? strdup(tmp) : NULL; #ifdef USE_SSL @@ -506,14 +512,13 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, else conn->dbName = strdup(dbName); - /* - * getPasswordFromFile mallocs its result, so we don't need strdup - * here - */ if (pwd) conn->pgpass = strdup(pwd); else if ((tmp = getenv("PGPASSWORD")) != NULL) conn->pgpass = strdup(tmp); + else if ((tmp = PasswordFromFile(conn->pghost, conn->pgport, + conn->dbName, conn->pguser)) != NULL) + conn->pgpass = tmp; else conn->pgpass = strdup(DefaultPassword); @@ -2946,7 +2951,7 @@ pwdfMatchesString(char *buf, char *token) return NULL; } -/* get a password from the password file. */ +/* Get a password from the password file. Return value is malloc'd. */ char * PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { @@ -2972,17 +2977,15 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) /* Look for it in the home dir */ home = getenv("HOME"); - if (home) + if (!home) + return NULL; + + pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1); + if (!pgpassfile) { - pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1); - if (!pgpassfile) - { - fprintf(stderr, libpq_gettext("out of memory\n")); - return NULL; - } - } - else + fprintf(stderr, libpq_gettext("out of memory\n")); return NULL; + } sprintf(pgpassfile, "%s/%s", home, PGPASSFILE); @@ -3014,12 +3017,18 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { char *t = buf, *ret; + int len; fgets(buf, LINELEN - 1, fp); - if (strlen(buf) == 0) + + len = strlen(buf); + if (len == 0) continue; - buf[strlen(buf) - 1] = 0; + /* Remove trailing newline */ + if (buf[len - 1] == '\n') + buf[len - 1] = 0; + if ((t = pwdfMatchesString(t, hostname)) == NULL || (t = pwdfMatchesString(t, port)) == NULL || (t = pwdfMatchesString(t, dbname)) == NULL || |