https://github.com/python/cpython/commit/e017971eb9f98b2caa3cde6a74ee0acec41529c4 commit: e017971eb9f98b2caa3cde6a74ee0acec41529c4 branch: main author: Brij Kapadia <[email protected]> committer: vstinner <[email protected]> date: 2026-03-23T23:41:53+01:00 summary:
gh-146199: Fix error handling in `code_richcompare` when `PyObject_RichCompareBool` fails (#146200) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Victor Stinner <[email protected]> files: A Misc/NEWS.d/next/Core_and_Builtins/2026-03-20-12-26-24.gh-issue-146199.vV8V9s.rst M Lib/test/test_code.py M Objects/codeobject.c diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 19fa387cd7b271..fac7e9148f1502 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -1164,6 +1164,18 @@ def test_stateless(self): with self.assertRaises(Exception): _testinternalcapi.verify_stateless_code(func) + def test_code_richcompare_raise_exception(self): + class BadStr(str): + def __eq__(self, _): + raise RuntimeError("Poison!") + + __hash__ = str.__hash__ + + c1 = compile("pass", "test", "exec") + c2 = c1.replace(co_name=BadStr("poison")) + c3 = compile("pass", "poison", "exec") + with self.assertRaises(RuntimeError): + c2 == c3 def isinterned(s): return s is sys.intern(('_' + s + '_')[1:-1]) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-20-12-26-24.gh-issue-146199.vV8V9s.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-20-12-26-24.gh-issue-146199.vV8V9s.rst new file mode 100644 index 00000000000000..0611a0d6a6d65a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-20-12-26-24.gh-issue-146199.vV8V9s.rst @@ -0,0 +1 @@ +Comparison of code objects now handles errors correctly. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 84a712b2b2c05d..891aa4ee78c0f2 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -2607,7 +2607,7 @@ code_richcompare(PyObject *self, PyObject *other, int op) cp = (PyCodeObject *)other; eq = PyObject_RichCompareBool(co->co_name, cp->co_name, Py_EQ); - if (!eq) goto unequal; + if (eq <= 0) goto unequal; eq = co->co_argcount == cp->co_argcount; if (!eq) goto unequal; eq = co->co_posonlyargcount == cp->co_posonlyargcount; _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/python-checkins.python.org Member address: [email protected]
