summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-08-06 21:37:10 (GMT)
committerGitHub <noreply@github.com>2024-08-06 21:37:10 (GMT)
commit5c161cb8329c941aa219dc34c56afa368516d6fb (patch)
tree819abfe98db80b0e0f776c05e8211adac5e6319e
parente808146af1841abc7d5f86470041d3ef7712050e (diff)
downloadcpython-5c161cb8329c941aa219dc34c56afa368516d6fb.zip
cpython-5c161cb8329c941aa219dc34c56afa368516d6fb.tar.gz
cpython-5c161cb8329c941aa219dc34c56afa368516d6fb.tar.bz2
[3.13] gh-122728: Fix SystemError in PyEval_GetLocals() (GH-122735) (#122757)
gh-122728: Fix SystemError in PyEval_GetLocals() (GH-122735) Fix PyEval_GetLocals() to avoid SystemError ("bad argument to internal function"). Don't redefine the 'ret' variable in the if block. Add an unit test on PyEval_GetLocals(). (cherry picked from commit 4767a6e31c0550836b2af45d27e374e721f0c4e6) Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r--Lib/test/test_capi/test_misc.py13
-rw-r--r--Misc/NEWS.d/next/C_API/2024-08-06-14-23-11.gh-issue-122728.l-fQ-v.rst2
-rw-r--r--Modules/_testcapimodule.c7
-rw-r--r--Python/ceval.c2
4 files changed, 23 insertions, 1 deletions
diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py
index f3d16e4..080b3e6 100644
--- a/Lib/test/test_capi/test_misc.py
+++ b/Lib/test/test_capi/test_misc.py
@@ -1180,6 +1180,19 @@ class CAPITest(unittest.TestCase):
gen = genf()
self.assertEqual(_testcapi.gen_get_code(gen), gen.gi_code)
+ def test_pyeval_getlocals(self):
+ # Test PyEval_GetLocals()
+ x = 1
+ self.assertEqual(_testcapi.pyeval_getlocals(),
+ {'self': self,
+ 'x': 1})
+
+ y = 2
+ self.assertEqual(_testcapi.pyeval_getlocals(),
+ {'self': self,
+ 'x': 1,
+ 'y': 2})
+
@requires_limited_api
class TestHeapTypeRelative(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/C_API/2024-08-06-14-23-11.gh-issue-122728.l-fQ-v.rst b/Misc/NEWS.d/next/C_API/2024-08-06-14-23-11.gh-issue-122728.l-fQ-v.rst
new file mode 100644
index 0000000..a128d6a
--- /dev/null
+++ b/Misc/NEWS.d/next/C_API/2024-08-06-14-23-11.gh-issue-122728.l-fQ-v.rst
@@ -0,0 +1,2 @@
+Fix :c:func:`PyEval_GetLocals` to avoid :exc:`SystemError` ("bad argument to
+internal function"). Patch by Victor Stinner.
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 1fa7c37..01b6bd8 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -3332,6 +3332,12 @@ test_critical_sections(PyObject *module, PyObject *Py_UNUSED(args))
Py_RETURN_NONE;
}
+static PyObject *
+pyeval_getlocals(PyObject *module, PyObject *Py_UNUSED(args))
+{
+ return Py_XNewRef(PyEval_GetLocals());
+}
+
static PyMethodDef TestMethods[] = {
{"set_errno", set_errno, METH_VARARGS},
{"test_config", test_config, METH_NOARGS},
@@ -3476,6 +3482,7 @@ static PyMethodDef TestMethods[] = {
{"test_weakref_capi", test_weakref_capi, METH_NOARGS},
{"function_set_warning", function_set_warning, METH_NOARGS},
{"test_critical_sections", test_critical_sections, METH_NOARGS},
+ {"pyeval_getlocals", pyeval_getlocals, METH_NOARGS},
{NULL, NULL} /* sentinel */
};
diff --git a/Python/ceval.c b/Python/ceval.c
index 866328e..351ddd2 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2482,7 +2482,7 @@ PyEval_GetLocals(void)
PyFrameObject *f = _PyFrame_GetFrameObject(current_frame);
PyObject *ret = f->f_locals_cache;
if (ret == NULL) {
- PyObject *ret = PyDict_New();
+ ret = PyDict_New();
if (ret == NULL) {
Py_DECREF(locals);
return NULL;