[Python-checkins] bpo-35742: Fix test_envar_unimportable in test_builtin. (GH-11561)

Serhiy Storchaka webhook-mailer at python.org
Tue Jan 15 06:26:50 EST 2019


https://github.com/python/cpython/commit/3607ef43c4a1a24d44f39ff54a77fc0af5bfa09a
commit: 3607ef43c4a1a24d44f39ff54a77fc0af5bfa09a
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019年01月15日T13:26:38+02:00
summary:
bpo-35742: Fix test_envar_unimportable in test_builtin. (GH-11561)
Handle the case of an empty module name in PYTHONBREAKPOINT.
Fixes a regression introduced in bpo-34756.
files:
M Lib/test/test_builtin.py
M Python/sysmodule.c
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index e2a4f2fa6d2f..5674ea89b1c4 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1608,6 +1608,7 @@ def test_envar_good_path_empty_string(self):
 def test_envar_unimportable(self):
 for envar in (
 '.', '..', '.foo', 'foo.', '.int', 'int.',
+ '.foo.bar', '..foo.bar', '/./',
 'nosuchbuiltin',
 'nosuchmodule.nosuchcallable',
 ):
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 869834b92432..5ea3772efded 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -141,11 +141,14 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
 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;
@@ -155,27 +158,29 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
 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(


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /