def test_envar_unimportable(self):
for envar in (
'.', '..', '.foo', 'foo.', '.int', 'int.',
+ '.foo.bar', '..foo.bar', '/./',
'nosuchbuiltin',
'nosuchmodule.nosuchcallable',
):
modulepath = PyUnicode_FromString("builtins");
attrname = envar;
}
- else {
+ else if (last_dot != envar) {
/* Split on the last dot; */
modulepath = PyUnicode_FromStringAndSize(envar, last_dot - envar);
attrname = last_dot + 1;
}
+ else {
+ goto warn;
+ }
if (modulepath == NULL) {
PyMem_RawFree(envar);
return NULL;
Py_DECREF(modulepath);
if (module == NULL) {
- goto error;
+ if (PyErr_ExceptionMatches(PyExc_ImportError)) {
+ goto warn;
+ }
+ PyMem_RawFree(envar);
+ return NULL;
}
PyObject *hook = PyObject_GetAttrString(module, attrname);
Py_DECREF(module);
if (hook == NULL) {
- goto error;
+ if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ goto warn;
+ }
+ PyMem_RawFree(envar);
+ return NULL;
}
PyMem_RawFree(envar);
PyObject *retval = _PyObject_FastCallKeywords(hook, args, nargs, keywords);
Py_DECREF(hook);
return retval;
- error:
- if (!PyErr_ExceptionMatches(PyExc_ImportError)
- && !PyErr_ExceptionMatches(PyExc_AttributeError))
- {
- PyMem_RawFree(envar);
- return NULL;
- }
+ warn:
/* If any of the imports went wrong, then warn and ignore. */
PyErr_Clear();
int status = PyErr_WarnFormat(