Don't forget to de-escape the password field in .pgpass.
authorRobert Haas <rhaas@postgresql.org>
Thu, 22 Dec 2011 17:55:27 +0000 (12:55 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 22 Dec 2011 18:02:57 +0000 (13:02 -0500)
This has been broken just about forever (or more specifically, commit
7f4981f4af1700456f98ac3f2b2d84959919ec81) and nobody noticed until
Richard Huxton reported it recently.  Analysis and fix by Ross
Reedstrom, although I didn't use his patch.  This doesn't seem
important enough to back-patch and is mildly backward incompatible, so
I'm just doing this in master.

src/interfaces/libpq/fe-connect.c

index 50f3f83aaebff31e39b641614ae4ba2b3f9c7a46..f3762af9da3605b57a96a3606aea8723ca86a2bd 100644 (file)
@@ -4904,7 +4904,9 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
    while (!feof(fp) && !ferror(fp))
    {
        char       *t = buf,
-                  *ret;
+                  *ret,
+                  *p1,
+                  *p2;
        int         len;
 
        if (fgets(buf, sizeof(buf), fp) == NULL)
@@ -4925,6 +4927,16 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
            continue;
        ret = strdup(t);
        fclose(fp);
+
+       /* De-escape password. */
+       for (p1 = p2 = ret; *p1 != ':' && *p1 != '\0'; ++p1, ++p2)
+       {
+           if (*p1 == '\\' && p1[1] != '\0')
+               ++p1;
+           *p2 = *p1;
+       }
+       *p2 = '\0';
+
        return ret;
    }