bpo-29849: fix memory leak in import_from by zhangyangyu · Pull Request #712 · python/cpython
x = PyObject_GetAttr(v, name); if (x != NULL || !PyErr_ExceptionMatches(PyExc_AttributeError))
if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) { PyErr_Clear(); PyErr_SetImportError( PyUnicode_FromFormat("cannot import name %R from %R (unknown location)", name, pkgname_or_unknown), pkgname, NULL); } else { PyErr_SetImportError( PyUnicode_FromFormat("cannot import name %R from %R (%S)", name, pkgname_or_unknown, pkgpath), pkgname, pkgpath); errmsg = PyUnicode_FromFormat( "cannot import name %R from %R (unknown location)", name, pkgname_or_unknown ); /* NULL check for errmsg done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, NULL); } else { errmsg = PyUnicode_FromFormat( "cannot import name %R from %R (%S)", name, pkgname_or_unknown, pkgpath ); /* NULL check for errmsg done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, pkgpath); }
Py_XDECREF(errmsg); Py_XDECREF(pkgname_or_unknown); Py_XDECREF(pkgpath); return NULL;