aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1998-10-02 16:18:20 +0000
committerBruce Momjian <bruce@momjian.us>1998-10-02 16:18:20 +0000
commit772a596ed2c0ebe1728b3dfa9a53a96e7fbdd0d0 (patch)
treea677f8c6e3501571bfe66602c8ed2b1459948e5f /src
parent9b7c6ee00b7935f94ab1142c0ee04d326e5f16ec (diff)
downloadpostgresql-772a596ed2c0ebe1728b3dfa9a53a96e7fbdd0d0.tar.gz
postgresql-772a596ed2c0ebe1728b3dfa9a53a96e7fbdd0d0.zip
Summary
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/libpq/hba.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c
index 381278e2b04..68d55e0f433 100644
--- a/src/backend/libpq/hba.c
+++ b/src/backend/libpq/hba.c
@@ -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,