From 772a596ed2c0ebe1728b3dfa9a53a96e7fbdd0d0 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 2 Oct 1998 16:18:20 +0000
Subject: [PATCH] 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
---
 src/backend/libpq/hba.c | 21 ++++++++++++++++++---
 1 file 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,
-- 
GitLab