gh-89452: Prefer gdbm-compat over ndbm (#92208)

This makes macOS gdbm provided by Homebrew not segfault through correct
selection of the linked library (-lgdbm_compat) *AND* the correct ndbm-style
header (gdbm-ndbm.h instead of the invalid ndbm.h).
This commit is contained in:
Łukasz Langa 2022-05-03 18:27:38 +02:00 committed by GitHub
parent feca9bbd1f
commit 6c25bf07e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 11 additions and 9 deletions

View file

@ -0,0 +1,2 @@
gdbm-compat is now preferred over ndbm if both are available on the system.
This allows avoiding the problematic ndbm.h on macOS.

View file

@ -12,10 +12,7 @@
/* Some Linux systems install gdbm/ndbm.h, but not ndbm.h. This supports /* Some Linux systems install gdbm/ndbm.h, but not ndbm.h. This supports
* whichever configure was able to locate. * whichever configure was able to locate.
*/ */
#if defined(USE_NDBM) #if defined(USE_GDBM_COMPAT)
#include <ndbm.h>
static const char which_dbm[] = "GNU gdbm"; /* EMX port of GDBM */
#elif defined(USE_GDBM_COMPAT)
#ifdef HAVE_GDBM_NDBM_H #ifdef HAVE_GDBM_NDBM_H
#include <gdbm/ndbm.h> #include <gdbm/ndbm.h>
#elif HAVE_GDBM_DASH_NDBM_H #elif HAVE_GDBM_DASH_NDBM_H
@ -24,6 +21,9 @@
#error "No gdbm/ndbm.h or gdbm-ndbm.h available" #error "No gdbm/ndbm.h or gdbm-ndbm.h available"
#endif #endif
static const char which_dbm[] = "GNU gdbm"; static const char which_dbm[] = "GNU gdbm";
#elif defined(USE_NDBM)
#include <ndbm.h>
static const char which_dbm[] = "GNU gdbm";
#elif defined(USE_BERKDB) #elif defined(USE_BERKDB)
#ifndef DB_DBM_HSEARCH #ifndef DB_DBM_HSEARCH
#define DB_DBM_HSEARCH 1 #define DB_DBM_HSEARCH 1

4
configure generated vendored
View file

@ -13726,7 +13726,7 @@ $as_echo_n "checking for --with-dbmliborder... " >&6; }
if test "${with_dbmliborder+set}" = set; then : if test "${with_dbmliborder+set}" = set; then :
withval=$with_dbmliborder; withval=$with_dbmliborder;
else else
with_dbmliborder=ndbm:gdbm:bdb with_dbmliborder=gdbm:ndbm:bdb
fi fi
@ -13749,7 +13749,7 @@ done
IFS=$as_save_IFS IFS=$as_save_IFS
if test "x$with_dbmliborder" = xerror; then : if test "x$with_dbmliborder" = xerror; then :
as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)" "$LINENO" 5 as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (gdbm:ndbm:bdb)" "$LINENO" 5
fi fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5

View file

@ -3850,7 +3850,7 @@ AC_CHECK_HEADERS([db.h], [
AC_MSG_CHECKING(for --with-dbmliborder) AC_MSG_CHECKING(for --with-dbmliborder)
AC_ARG_WITH(dbmliborder, AC_ARG_WITH(dbmliborder,
AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]),
[], [with_dbmliborder=ndbm:gdbm:bdb]) [], [with_dbmliborder=gdbm:ndbm:bdb])
have_gdbm_dbmliborder=no have_gdbm_dbmliborder=no
as_save_IFS=$IFS as_save_IFS=$IFS
@ -3865,7 +3865,7 @@ for db in $with_dbmliborder; do
done done
IFS=$as_save_IFS IFS=$as_save_IFS
AS_VAR_IF([with_dbmliborder], [error], [ AS_VAR_IF([with_dbmliborder], [error], [
AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)]) AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:... (gdbm:ndbm:bdb)])
]) ])
AC_MSG_RESULT($with_dbmliborder) AC_MSG_RESULT($with_dbmliborder)

View file

@ -1207,7 +1207,7 @@ class PyBuildExt(build_ext):
if dbm_args: if dbm_args:
dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":") dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
else: else:
dbm_order = "ndbm:gdbm:bdb".split(":") dbm_order = "gdbm:ndbm:bdb".split(":")
dbmext = None dbmext = None
for cand in dbm_order: for cand in dbm_order:
if cand == "ndbm": if cand == "ndbm":