1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-26 01:22:12 +03:00

Fix handling of HBA ldapserver with multiple hostnames.

Commit 35c0754f failed to handle space-separated lists of alternative
hostnames in ldapserver, when building a URI for ldap_initialize()
(OpenLDAP).  Such lists need to be expanded to space-separated URIs.

Repair.  Back-patch to 11, to fix bug report #15495.

Author: Thomas Munro
Reported-by: Renaud Navarro
Discussion: https://postgr.es/m/15495-2c39fc196c95cd72%40postgresql.org
This commit is contained in:
Thomas Munro
2018-11-13 17:39:36 +13:00
parent 6a3dcd2856
commit 257ef3cd4f
2 changed files with 54 additions and 6 deletions

View File

@ -2352,12 +2352,44 @@ InitializeLDAPConnection(Port *port, LDAP **ldap)
#else
#ifdef HAVE_LDAP_INITIALIZE
{
char *uri;
const char *hostnames = port->hba->ldapserver;
char *uris = NULL;
uri = psprintf("%s://%s:%d", scheme, port->hba->ldapserver,
port->hba->ldapport);
r = ldap_initialize(ldap, uri);
pfree(uri);
/*
* We have a space-separated list of hostnames. Convert it
* to a space-separated list of URIs.
*/
do
{
const char *hostname;
size_t hostname_size;
char *new_uris;
/* Find the leading hostname. */
hostname_size = strcspn(hostnames, " ");
hostname = pnstrdup(hostnames, hostname_size);
/* Append a URI for this hostname. */
new_uris = psprintf("%s%s%s://%s:%d",
uris ? uris : "",
uris ? " " : "",
scheme,
hostname,
port->hba->ldapport);
pfree(hostname);
if (uris)
pfree(uris);
uris = new_uris;
/* Step over this hostname and any spaces. */
hostnames += hostname_size;
while (*hostnames == ' ')
++hostnames;
} while (*hostnames);
r = ldap_initialize(ldap, uris);
pfree(uris);
if (r != LDAP_SUCCESS)
{
ereport(LOG,