gh-102250: Fix double-decref in COMPARE_AND_BRANCH error case (GH-102287)

This commit is contained in:
Dennis Sweeney 2023-02-27 05:46:40 -05:00 committed by GitHub
parent 101a12c576
commit e3c3f9fec0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 6 deletions

View File

@ -319,6 +319,26 @@ class BoolTest(unittest.TestCase):
return -1
self.assertRaises(ValueError, bool, Eggs())
def test_interpreter_convert_to_bool_raises(self):
class SymbolicBool:
def __bool__(self):
raise TypeError
class Symbol:
def __gt__(self, other):
return SymbolicBool()
x = Symbol()
with self.assertRaises(TypeError):
if x > 0:
msg = "x > 0 was true"
else:
msg = "x > 0 was false"
# This used to create negative refcounts, see gh-102250
del x
def test_from_bytes(self):
self.assertIs(bool.from_bytes(b'\x00'*8, 'big'), False)
self.assertIs(bool.from_bytes(b'abcd', 'little'), True)

View File

@ -0,0 +1 @@
Fixed a segfault occurring when the interpreter calls a ``__bool__`` method that raises.

View File

@ -1754,9 +1754,7 @@ dummy_func(
int offset = next_instr[1].op.arg;
int err = PyObject_IsTrue(cond);
Py_DECREF(cond);
if (err < 0) {
goto error;
}
ERROR_IF(err < 0, error);
if (jump_on_true == (err != 0)) {
JUMPBY(offset);
}

View File

@ -2205,9 +2205,7 @@
int offset = next_instr[1].op.arg;
int err = PyObject_IsTrue(cond);
Py_DECREF(cond);
if (err < 0) {
goto error;
}
if (err < 0) goto pop_2_error;
if (jump_on_true == (err != 0)) {
JUMPBY(offset);
}