[Python-checkins] bpo-22689: Copy the result of getenv() in sys_breakpointhook(). (GH-8194)

Miss Islington (bot) webhook-mailer at python.org
Mon Jul 9 15:06:07 EDT 2018


https://github.com/python/cpython/commit/6f4fbf8ea428e13959a7aaba0ac9725ed407752a
commit: 6f4fbf8ea428e13959a7aaba0ac9725ed407752a
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018年07月09日T12:06:02-07:00
summary:
bpo-22689: Copy the result of getenv() in sys_breakpointhook(). (GH-8194)
(cherry picked from commit f60bf0e168255b7675a4c049250ba6b202f8e647)
Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>
files:
M Python/sysmodule.c
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index d68572d40033..498fa91fcc3d 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -107,7 +107,7 @@ static PyObject *
 sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
 {
 assert(!PyErr_Occurred());
- const char *envar = Py_GETENV("PYTHONBREAKPOINT");
+ char *envar = Py_GETENV("PYTHONBREAKPOINT");
 
 if (envar == NULL || strlen(envar) == 0) {
 envar = "pdb.set_trace";
@@ -116,6 +116,15 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
 /* The breakpoint is explicitly no-op'd. */
 Py_RETURN_NONE;
 }
+ /* According to POSIX the string returned by getenv() might be invalidated
+ * or the string content might be overwritten by a subsequent call to
+ * getenv(). Since importing a module can performs the getenv() calls,
+ * we need to save a copy of envar. */
+ envar = _PyMem_RawStrdup(envar);
+ if (envar == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
 const char *last_dot = strrchr(envar, '.');
 const char *attrname = NULL;
 PyObject *modulepath = NULL;
@@ -131,12 +140,14 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
 attrname = last_dot + 1;
 }
 if (modulepath == NULL) {
+ PyMem_RawFree(envar);
 return NULL;
 }
 
 PyObject *fromlist = Py_BuildValue("(s)", attrname);
 if (fromlist == NULL) {
 Py_DECREF(modulepath);
+ PyMem_RawFree(envar);
 return NULL;
 }
 PyObject *module = PyImport_ImportModuleLevelObject(
@@ -154,6 +165,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
 if (hook == NULL) {
 goto error;
 }
+ PyMem_RawFree(envar);
 PyObject *retval = _PyObject_FastCallKeywords(hook, args, nargs, keywords);
 Py_DECREF(hook);
 return retval;
@@ -164,6 +176,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
 int status = PyErr_WarnFormat(
 PyExc_RuntimeWarning, 0,
 "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar);
+ PyMem_RawFree(envar);
 if (status < 0) {
 /* Printing the warning raised an exception. */
 return NULL;


More information about the Python-checkins mailing list

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