mirror of
https://github.com/python/cpython.git
synced 2025-09-30 12:21:51 +00:00
[3.6] bpo-31492: Fix assertion failures in case of a module with a bad __name__ attribute. (GH-3620). (#3773)
(cherry picked from commit 6db7033192
)
This commit is contained in:
parent
a1c49f6f09
commit
f0db2dfda7
4 changed files with 20 additions and 4 deletions
|
@ -353,6 +353,18 @@ class ImportTests(unittest.TestCase):
|
||||||
with self.assertRaises(ImportError):
|
with self.assertRaises(ImportError):
|
||||||
from test_from_import_AttributeError import does_not_exist
|
from test_from_import_AttributeError import does_not_exist
|
||||||
|
|
||||||
|
@cpython_only
|
||||||
|
def test_issue31492(self):
|
||||||
|
# There shouldn't be an assertion failure in case of failing to import
|
||||||
|
# from a module with a bad __name__ attribute, or in case of failing
|
||||||
|
# to access an attribute of such a module.
|
||||||
|
with swap_attr(os, '__name__', None):
|
||||||
|
with self.assertRaises(ImportError):
|
||||||
|
from os import does_not_exist
|
||||||
|
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
os.does_not_exist
|
||||||
|
|
||||||
def test_concurrency(self):
|
def test_concurrency(self):
|
||||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'data'))
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'data'))
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fix assertion failures in case of failing to import from a module with a bad
|
||||||
|
``__name__`` attribute, and in case of failing to access an attribute of such
|
||||||
|
a module. Patch by Oren Milman.
|
|
@ -667,14 +667,11 @@ module_getattro(PyModuleObject *m, PyObject *name)
|
||||||
if (m->md_dict) {
|
if (m->md_dict) {
|
||||||
_Py_IDENTIFIER(__name__);
|
_Py_IDENTIFIER(__name__);
|
||||||
mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
|
mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
|
||||||
if (mod_name) {
|
if (mod_name && PyUnicode_Check(mod_name)) {
|
||||||
PyErr_Format(PyExc_AttributeError,
|
PyErr_Format(PyExc_AttributeError,
|
||||||
"module '%U' has no attribute '%U'", mod_name, name);
|
"module '%U' has no attribute '%U'", mod_name, name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if (PyErr_Occurred()) {
|
|
||||||
PyErr_Clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
PyErr_Format(PyExc_AttributeError,
|
PyErr_Format(PyExc_AttributeError,
|
||||||
"module has no attribute '%U'", name);
|
"module has no attribute '%U'", name);
|
||||||
|
|
|
@ -5254,6 +5254,10 @@ import_from(PyObject *v, PyObject *name)
|
||||||
if (pkgname == NULL) {
|
if (pkgname == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (!PyUnicode_Check(pkgname)) {
|
||||||
|
Py_CLEAR(pkgname);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
|
fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
|
||||||
Py_DECREF(pkgname);
|
Py_DECREF(pkgname);
|
||||||
if (fullmodname == NULL) {
|
if (fullmodname == NULL) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue