diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-07-09 19:06:02 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-09 19:06:02 (GMT) |
| commit | 6f4fbf8ea428e13959a7aaba0ac9725ed407752a (patch) | |
| tree | d74ccc5c24fed544aac0d4fbd177da18f11603d7 /Python/sysmodule.c | |
| parent | 958a25ea9fdf3e47f3f0829073dc77c0869488dd (diff) | |
| download | cpython-6f4fbf8ea428e13959a7aaba0ac9725ed407752a.zip cpython-6f4fbf8ea428e13959a7aaba0ac9725ed407752a.tar.gz cpython-6f4fbf8ea428e13959a7aaba0ac9725ed407752a.tar.bz2 | |
bpo-22689: Copy the result of getenv() in sys_breakpointhook(). (GH-8194)
(cherry picked from commit f60bf0e168255b7675a4c049250ba6b202f8e647)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Python/sysmodule.c')
| -rw-r--r-- | Python/sysmodule.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c index d68572d..498fa91 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; |
