]> granicus.if.org Git - postgresql/commitdiff
Summary
authorBruce Momjian <bruce@momjian.us>
Fri, 2 Oct 1998 16:18:20 +0000 (16:18 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 2 Oct 1998 16:18:20 +0000 (16:18 +0000)
The ident() function in src/backend/libpq/hba.c doesn't cope when
postmaster is contacted on an IP alias. This patch fixes it.

 Malcolm Beattie

src/backend/libpq/hba.c

index 381278e2b04c556ec0ecdd040c1eccd2f112e1df..68d55e0f433fa7e5a6c3dfed961bc3640e3e0178 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.35 1998/09/01 04:28:48 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.36 1998/10/02 16:18:20 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -565,6 +565,7 @@ ident(const struct in_addr remote_ip_addr, const struct in_addr local_ip_addr,
        else
        {
                struct sockaddr_in ident_server;
+               struct sockaddr_in la;
 
                /*
                 * Socket address of Ident server on the system from which client
@@ -573,8 +574,22 @@ ident(const struct in_addr remote_ip_addr, const struct in_addr local_ip_addr,
                ident_server.sin_family = AF_INET;
                ident_server.sin_port = htons(IDENT_PORT);
                ident_server.sin_addr = remote_ip_addr;
-               rc = connect(sock_fd,
-                          (struct sockaddr *) & ident_server, sizeof(ident_server));
+
+               /*
+                * Bind to the address which the client originally contacted,
+                * otherwise the ident server won't be able to match up the
+                * right connection. This is necessary if the PostgreSQL
+                * server is running on an IP alias.
+                */
+               memset(&la, 0, sizeof(la));
+               la.sin_family = AF_INET;
+               la.sin_addr = local_ip_addr;
+               rc = bind(sock_fd, (struct sockaddr *) &la, sizeof(la));
+               if (rc == 0)
+               {
+                       rc = connect(sock_fd,
+                                    (struct sockaddr *) & ident_server, sizeof(ident_server));
+               }
                if (rc != 0)
                {
                        sprintf(PQerrormsg,