Staging
v0.5.1
https://github.com/python/cpython
Revision 5b1ef200d31a74a9b478d0217d73ed0a659a8a06 authored by Victor Stinner on 17 March 2020, 17:09:46 UTC, committed by GitHub on 17 March 2020, 17:09:46 UTC
Extension modules: m_traverse, m_clear and m_free functions of
PyModuleDef are no longer called if the module state was requested
but is not allocated yet. This is the case immediately after the
module is created and before the module is executed (Py_mod_exec
function). More precisely, these functions are not called if m_size is
greater than 0 and the module state (as returned by
PyModule_GetState()) is NULL.

Extension modules without module state (m_size <= 0) are not affected.

Co-Authored-By: Petr Viktorin <encukou@gmail.com>
1 parent 5226894
Raw File
Tip revision: 5b1ef200d31a74a9b478d0217d73ed0a659a8a06 authored by Victor Stinner on 17 March 2020, 17:09:46 UTC
bpo-39824: module_traverse() don't call m_traverse if md_state=NULL (GH-18738)
Tip revision: 5b1ef20
dynload_hpux.c

/* Support for dynamic loading of extension modules */

#include "dl.h"
#include <errno.h>

#include "Python.h"
#include "importdl.h"
#include "pycore_pystate.h"

#if defined(__hp9000s300)
#define FUNCNAME_PATTERN "_%.20s_%.200s"
#else
#define FUNCNAME_PATTERN "%.20s_%.200s"
#endif

const char *_PyImport_DynLoadFiletab[] = {SHLIB_EXT, NULL};

dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix,
                                       const char *shortname,
                                       const char *pathname, FILE *fp)
{
    int flags = BIND_FIRST | BIND_DEFERRED;
    int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose;
    if (verbose) {
        flags = BIND_FIRST | BIND_IMMEDIATE |
            BIND_NONFATAL | BIND_VERBOSE;
        printf("shl_load %s\n",pathname);
    }

    shl_t lib = shl_load(pathname, flags, 0);
    /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */
    if (lib == NULL) {
        if (verbose) {
            perror(pathname);
        }
        char buf[256];
        PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s",
                      pathname);
        PyObject *buf_ob = PyUnicode_FromString(buf);
        PyObject *shortname_ob = PyUnicode_FromString(shortname);
        PyObject *pathname_ob = PyUnicode_FromString(pathname);
        PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob);
        Py_DECREF(buf_ob);
        Py_DECREF(shortname_ob);
        Py_DECREF(pathname_ob);
        return NULL;
    }

    char funcname[258];
    PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN,
                  prefix, shortname);
    if (verbose) {
        printf("shl_findsym %s\n", funcname);
    }

    dl_funcptr p;
    if (shl_findsym(&lib, funcname, TYPE_UNDEFINED, (void *) &p) == -1) {
        shl_unload(lib);
        p = NULL;
    }
    if (p == NULL && verbose) {
        perror(funcname);
    }
    return p;
}
back to top