diff -r f39fac22ca9a Python/dynload_shlib.c --- a/Python/dynload_shlib.c Fri Nov 15 17:35:31 2013 +0100 +++ b/Python/dynload_shlib.c Fri Nov 15 18:13:17 2013 +0000 @@ -60,6 +60,36 @@ static int nhandles = 0; +static void _PyErr_SetFromDlerror(const char *error, + const char *shortname, + const char *pathname) +{ + PyObject *mod_name; + PyObject *path; + PyObject *error_ob; + if (error == NULL) + error = "unknown dlopen() error"; + error_ob = PyUnicode_FromString(error); + if (error_ob == NULL) + return; + mod_name = PyUnicode_FromString(shortname); + if (mod_name == NULL) { + Py_DECREF(error_ob); + return; + } + path = PyUnicode_FromString(pathname); + if (path == NULL) { + Py_DECREF(error_ob); + Py_DECREF(mod_name); + return; + } + PyErr_SetImportError(error_ob, mod_name, path); + Py_DECREF(error_ob); + Py_DECREF(mod_name); + Py_DECREF(path); +} + + dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname, const char *pathname, FILE *fp) { @@ -90,6 +120,10 @@ statb.st_ino == handles[i].ino) { p = (dl_funcptr) dlsym(handles[i].handle, funcname); + if (p == NULL) { + _PyErr_SetFromDlerror(dlerror(), shortname, pathname); + return NULL; + } return p; } } @@ -121,34 +155,15 @@ handle = dlopen(pathname, dlopenflags); if (handle == NULL) { - PyObject *mod_name; - PyObject *path; - PyObject *error_ob; - const char *error = dlerror(); - if (error == NULL) - error = "unknown dlopen() error"; - error_ob = PyUnicode_FromString(error); - if (error_ob == NULL) - return NULL; - mod_name = PyUnicode_FromString(shortname); - if (mod_name == NULL) { - Py_DECREF(error_ob); - return NULL; - } - path = PyUnicode_FromString(pathname); - if (path == NULL) { - Py_DECREF(error_ob); - Py_DECREF(mod_name); - return NULL; - } - PyErr_SetImportError(error_ob, mod_name, path); - Py_DECREF(error_ob); - Py_DECREF(mod_name); - Py_DECREF(path); + _PyErr_SetFromDlerror(dlerror(), shortname, pathname); return NULL; } if (fp != NULL && nhandles < 128) handles[nhandles++].handle = handle; p = (dl_funcptr) dlsym(handle, funcname); + if (p == NULL) { + _PyErr_SetFromDlerror(dlerror(), shortname, pathname); + return NULL; + } return p; }