summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-05-10 18:42:02 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2022-05-10 18:42:02 -0400
commit12736e7dc326c404ae0f12ebdf5d1dbb954ec5f6 (patch)
treeb42b279246907d1f046a5bd6c8e6874372a8d968
parent0e9cc8c0f3bc411de888a77318d8854ccba90e80 (diff)
configure: don't probe for libldap_r if libldap is 2.5 or newer.
In OpenLDAP 2.5 and later, libldap itself is always thread-safe and there's never a libldap_r. Our existing coding dealt with that by assuming it wouldn't find libldap_r if libldap is thread-safe. But that rule fails to cope if there are multiple OpenLDAP versions visible, as is likely to be the case on macOS in particular. We'd end up using shiny new libldap in the backend and a hoary libldap_r in libpq. Instead, once we've found libldap, check if it's >= 2.5 (by probing for a function introduced then) and don't bother looking for libldap_r if so. While one can imagine library setups that this'd still give the wrong answer for, they seem unlikely to occur in practice. Per report from Peter Eisentraut. Back-patch to all supported branches. Discussion: https://postgr.es/m/fedacd7c-2a38-25c9-e7ff-dea549d0e979@enterprisedb.com
-rwxr-xr-xconfigure13
-rw-r--r--configure.ac9
2 files changed, 20 insertions, 2 deletions
diff --git a/configure b/configure
index c708902cbf6..c1b6fc9e85f 100755
--- a/configure
+++ b/configure
@@ -13192,7 +13192,18 @@ _ACEOF
fi
done
- if test "$enable_thread_safety" = yes; then
+ # The separate ldap_r library only exists in OpenLDAP < 2.5, and if we
+ # have 2.5 or later, we shouldn't even probe for ldap_r (we might find a
+ # library from a separate OpenLDAP installation). The most reliable
+ # way to check that is to check for a function introduced in 2.5.
+ ac_fn_c_check_func "$LINENO" "ldap_verify_credentials" "ac_cv_func_ldap_verify_credentials"
+if test "x$ac_cv_func_ldap_verify_credentials" = xyes; then :
+ thread_safe_libldap=yes
+else
+ thread_safe_libldap=no
+fi
+
+ if test "$enable_thread_safety" = yes -a "$thread_safe_libldap" = no; then
# Use ldap_r for FE if available, else assume ldap is thread-safe.
# On some platforms ldap_r fails to link without PTHREAD_LIBS.
LIBS="$_LIBS"
diff --git a/configure.ac b/configure.ac
index 8057764acc3..a3088f3d642 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1334,7 +1334,14 @@ if test "$with_ldap" = yes ; then
LDAP_LIBS_BE="-lldap $EXTRA_LDAP_LIBS"
# This test is carried out against libldap.
AC_CHECK_FUNCS([ldap_initialize])
- if test "$enable_thread_safety" = yes; then
+ # The separate ldap_r library only exists in OpenLDAP < 2.5, and if we
+ # have 2.5 or later, we shouldn't even probe for ldap_r (we might find a
+ # library from a separate OpenLDAP installation). The most reliable
+ # way to check that is to check for a function introduced in 2.5.
+ AC_CHECK_FUNC([ldap_verify_credentials],
+ [thread_safe_libldap=yes],
+ [thread_safe_libldap=no])
+ if test "$enable_thread_safety" = yes -a "$thread_safe_libldap" = no; then
# Use ldap_r for FE if available, else assume ldap is thread-safe.
# On some platforms ldap_r fails to link without PTHREAD_LIBS.
LIBS="$_LIBS"