]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-89452: Prefer gdbm-compat over ndbm (#92208)
authorŁukasz Langa <lukasz@langa.pl>
Tue, 3 May 2022 16:27:38 +0000 (18:27 +0200)
committerGitHub <noreply@github.com>
Tue, 3 May 2022 16:27:38 +0000 (18:27 +0200)
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).

Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst [new file with mode: 0644]
Modules/_dbmmodule.c
configure
configure.ac
setup.py

diff --git a/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst b/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst
new file mode 100644 (file)
index 0000000..dd4954d
--- /dev/null
@@ -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.
index de8b2304ed8f1429c9386412a1e1fa5f8a1773f8..5913b034790e9c449b9a6ddc66572e15226a2d12 100644 (file)
 /* Some Linux systems install gdbm/ndbm.h, but not ndbm.h.  This supports
  * whichever configure was able to locate.
  */
-#if defined(USE_NDBM)
-  #include <ndbm.h>
-  static const char which_dbm[] = "GNU gdbm";  /* EMX port of GDBM */
-#elif defined(USE_GDBM_COMPAT)
+#if defined(USE_GDBM_COMPAT)
   #ifdef HAVE_GDBM_NDBM_H
     #include <gdbm/ndbm.h>
   #elif HAVE_GDBM_DASH_NDBM_H
@@ -24,6 +21,9 @@
     #error "No gdbm/ndbm.h or gdbm-ndbm.h available"
   #endif
   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)
   #ifndef DB_DBM_HSEARCH
     #define DB_DBM_HSEARCH 1
index 2c47a1e85c14525aaf9f841e504635c4e4095de5..0f5c2c80f6067a451e22998277703f1d83b88c43 100755 (executable)
--- a/configure
+++ b/configure
@@ -13726,7 +13726,7 @@ $as_echo_n "checking for --with-dbmliborder... " >&6; }
 if test "${with_dbmliborder+set}" = set; then :
   withval=$with_dbmliborder;
 else
-  with_dbmliborder=ndbm:gdbm:bdb
+  with_dbmliborder=gdbm:ndbm:bdb
 fi
 
 
@@ -13749,7 +13749,7 @@ done
 IFS=$as_save_IFS
 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
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5
index 62da321a98af188fc5bbf8896b33b0f7260a8255..8c0711d8a9a15977cc8bb9b97bdeff3ee7b49161 100644 (file)
@@ -3850,7 +3850,7 @@ AC_CHECK_HEADERS([db.h], [
 AC_MSG_CHECKING(for --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'.]),
-[], [with_dbmliborder=ndbm:gdbm:bdb])
+[], [with_dbmliborder=gdbm:ndbm:bdb])
 
 have_gdbm_dbmliborder=no
 as_save_IFS=$IFS
@@ -3865,7 +3865,7 @@ for db in $with_dbmliborder; do
 done
 IFS=$as_save_IFS
 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)
 
index 60a45cf260f6b8ad3e3120a894e27f1340577cec..f45cd6de33749bde2ad24663b9dbe5f84482dcbe 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1207,7 +1207,7 @@ class PyBuildExt(build_ext):
             if dbm_args:
                 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
             else:
-                dbm_order = "ndbm:gdbm:bdb".split(":")
+                dbm_order = "gdbm:ndbm:bdb".split(":")
             dbmext = None
             for cand in dbm_order:
                 if cand == "ndbm":