]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45582: Fix framework path and bootstrap build (GH-29954)
authorChristian Heimes <christian@python.org>
Tue, 7 Dec 2021 18:09:53 +0000 (20:09 +0200)
committerGitHub <noreply@github.com>
Tue, 7 Dec 2021 18:09:53 +0000 (19:09 +0100)
* Check NS API return values for NULL to prevent segfault in
  ``_bootstrap_python``.
* Set modPathInitialized to 1 so the ``decode_to_dict`` path is used.

Signed-off-by: Christian Heimes <christian@python.org>
Makefile.pre.in
Modules/getpath.c

index 94fc5c37209ef53d3477979cab542ab75e8b4be7..8e6e553554de12ceb3c627d8ffc3fc2a28834023 100644 (file)
@@ -954,9 +954,9 @@ BOOTSTRAP_HEADERS = \
 
 Programs/_bootstrap_python.o: Programs/_bootstrap_python.c $(BOOTSTRAP_HEADERS) $(PYTHON_HEADERS)
 
-_bootstrap_python: $(LIBRARY_OBJS_OMIT_FROZEN) Programs/_bootstrap_python.o Modules/getpath_bootstrap.o Modules/Setup.local
+_bootstrap_python: $(LIBRARY_OBJS_OMIT_FROZEN) Programs/_bootstrap_python.o Modules/getpath.o Modules/Setup.local
        $(LINKCC) $(PY_LDFLAGS_NOLTO) -o $@ $(LIBRARY_OBJS_OMIT_FROZEN) \
-               Programs/_bootstrap_python.o Modules/getpath_bootstrap.o $(LIBS) $(MODLIBS) $(SYSLIBS)
+               Programs/_bootstrap_python.o Modules/getpath.o $(LIBS) $(MODLIBS) $(SYSLIBS)
 
 ############################################################################
 # Deepfreeze targets
@@ -1205,18 +1205,6 @@ Modules/getpath.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h M
                -DPLATLIBDIR='"$(PLATLIBDIR)"' \
                -o $@ $(srcdir)/Modules/getpath.c
 
-# like getpath.o with additional -DPY_BOOTSTRAP_PYTHON=1
-Modules/getpath_bootstrap.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h Makefile $(PYTHON_HEADERS)
-       $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \
-               -DPREFIX='"$(prefix)"' \
-               -DEXEC_PREFIX='"$(exec_prefix)"' \
-               -DVERSION='"$(VERSION)"' \
-               -DVPATH='"$(VPATH)"' \
-               -DPLATLIBDIR='"$(PLATLIBDIR)"' \
-               -DPY_BOOTSTRAP_PYTHON=1 \
-               -o $@ $(srcdir)/Modules/getpath.c
-
-
 Programs/python.o: $(srcdir)/Programs/python.c
        $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Programs/python.c
 
index 9ce7260f77826102dde900bdff5f1aa5ef0ece97..0b982f10e418b293f2bdc66341ab1f5c4e3a7187 100644 (file)
@@ -754,12 +754,10 @@ library_to_dict(PyObject *dict, const char *key)
     if (PyWin_DLLhModule) {
         return winmodule_to_dict(dict, key, PyWin_DLLhModule);
     }
-#elif defined(WITH_NEXT_FRAMEWORK) && !defined(PY_BOOTSTRAP_PYTHON)
-    // _bootstrap_python does not use framework and crashes
+#elif defined(WITH_NEXT_FRAMEWORK)
     static char modPath[MAXPATHLEN + 1];
     static int modPathInitialized = -1;
     if (modPathInitialized < 0) {
-        NSModule pythonModule;
         modPathInitialized = 0;
 
         /* On Mac OS X we have a special case if we're running from a framework.
@@ -767,12 +765,17 @@ library_to_dict(PyObject *dict, const char *key)
            which is in the framework, not relative to the executable, which may
            be outside of the framework. Except when we're in the build
            directory... */
-        pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize"));
-
-        /* Use dylib functions to find out where the framework was loaded from */
-        const char *path = NSLibraryNameForModule(pythonModule);
-        if (path) {
-            strncpy(modPath, path, MAXPATHLEN);
+        NSSymbol symbol = NSLookupAndBindSymbol("_Py_Initialize");
+        if (symbol != NULL) {
+            NSModule pythonModule = NSModuleForSymbol(symbol);
+            if (pythonModule != NULL) {
+                /* Use dylib functions to find out where the framework was loaded from */
+                const char *path = NSLibraryNameForModule(pythonModule);
+                if (path) {
+                    strncpy(modPath, path, MAXPATHLEN);
+                    modPathInitialized = 1;
+                }
+            }
         }
     }
     if (modPathInitialized > 0) {