Replace loading of ldap_start_tls_sA() by direct function call
This change impacts the backend-side code in charge of starting a LDAP
TLS session. It is a bit sad that it is not possible to unify the WIN32
and non-WIN32 code paths, but the different number of arguments for both
discard this possibility.
This is similar to 47bd0b3
, where this replaces the last function
loading that seems worth it, any others being either environment or
version-dependent.
Reported-by: Thomas Munro
Reviewed-by: Thomas Munro
Discussion: https://postgr.es/m/Yx0rxpNgDh8tN4XA@paquier.xyz
This commit is contained in:
parent
857808a411
commit
c3fb5809ea
|
@ -135,14 +135,6 @@ static int CheckBSDAuth(Port *port, char *user);
|
|||
#else
|
||||
#include <winldap.h>
|
||||
|
||||
/* Correct header from the Platform SDK */
|
||||
typedef
|
||||
ULONG (*__ldap_start_tls_sA) (IN PLDAP ExternalHandle,
|
||||
OUT PULONG ServerReturnValue,
|
||||
OUT LDAPMessage **result,
|
||||
IN PLDAPControlA * ServerControls,
|
||||
IN PLDAPControlA * ClientControls
|
||||
);
|
||||
#endif
|
||||
|
||||
static int CheckLDAPAuth(Port *port);
|
||||
|
@ -2348,48 +2340,7 @@ InitializeLDAPConnection(Port *port, LDAP **ldap)
|
|||
#ifndef WIN32
|
||||
if ((r = ldap_start_tls_s(*ldap, NULL, NULL)) != LDAP_SUCCESS)
|
||||
#else
|
||||
static __ldap_start_tls_sA _ldap_start_tls_sA = NULL;
|
||||
|
||||
if (_ldap_start_tls_sA == NULL)
|
||||
{
|
||||
/*
|
||||
* Need to load this function dynamically because it may not exist
|
||||
* on Windows, and causes a load error for the whole exe if
|
||||
* referenced.
|
||||
*/
|
||||
HANDLE ldaphandle;
|
||||
|
||||
ldaphandle = LoadLibrary("WLDAP32.DLL");
|
||||
if (ldaphandle == NULL)
|
||||
{
|
||||
/*
|
||||
* should never happen since we import other files from
|
||||
* wldap32, but check anyway
|
||||
*/
|
||||
ereport(LOG,
|
||||
(errmsg("could not load library \"%s\": error code %lu",
|
||||
"WLDAP32.DLL", GetLastError())));
|
||||
ldap_unbind(*ldap);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
_ldap_start_tls_sA = (__ldap_start_tls_sA) (pg_funcptr_t) GetProcAddress(ldaphandle, "ldap_start_tls_sA");
|
||||
if (_ldap_start_tls_sA == NULL)
|
||||
{
|
||||
ereport(LOG,
|
||||
(errmsg("could not load function _ldap_start_tls_sA in wldap32.dll"),
|
||||
errdetail("LDAP over SSL is not supported on this platform.")));
|
||||
ldap_unbind(*ldap);
|
||||
FreeLibrary(ldaphandle);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Leak LDAP handle on purpose, because we need the library to
|
||||
* stay open. This is ok because it will only ever be leaked once
|
||||
* per process and is automatically cleaned up on process exit.
|
||||
*/
|
||||
}
|
||||
if ((r = _ldap_start_tls_sA(*ldap, NULL, NULL, NULL, NULL)) != LDAP_SUCCESS)
|
||||
if ((r = ldap_start_tls_s(*ldap, NULL, NULL, NULL, NULL)) != LDAP_SUCCESS)
|
||||
#endif
|
||||
{
|
||||
ereport(LOG,
|
||||
|
|
Loading…
Reference in New Issue