diff options
author | Bruce Momjian <bruce@momjian.us> | 1998-10-02 16:18:20 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1998-10-02 16:18:20 +0000 |
commit | 772a596ed2c0ebe1728b3dfa9a53a96e7fbdd0d0 (patch) | |
tree | a677f8c6e3501571bfe66602c8ed2b1459948e5f /src | |
parent | 9b7c6ee00b7935f94ab1142c0ee04d326e5f16ec (diff) | |
download | postgresql-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.c | 21 |
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, |