This commit is contained in:
Keming 2025-12-23 14:13:58 +05:30 committed by GitHub
commit 47db12d2af
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 0 deletions

View file

@ -675,6 +675,35 @@ class TestSet(TestJointOps, unittest.TestCase):
with self.assertRaises(KeyError):
myset.discard(elem2)
def test_set_add_to_dummy_slot(self):
# gh-141805
tasks = set()
class Dummy:
def __hash__(self):
return 0
class CorruptTrigger:
triggered = False
def __hash__(self):
return 0
def __eq__(self, value):
if not self.triggered:
self.triggered = True
tasks.add(self)
return False
tasks.add(Dummy())
tasks.add(Dummy())
tasks.pop()
self.assertEqual(len(tasks), 1)
tasks.add(CorruptTrigger())
self.assertEqual(len(tasks), 2)
# cover the case in gh-141805 that triggers segfault
repr(tasks)
class SetSubclass(set):
pass

View file

@ -0,0 +1,2 @@
Fix set corruption due to invalid length calculation when set additions occur
in the element comparison (:meth:`object.__eq__`) methods.

View file

@ -298,6 +298,7 @@ set_add_entry_takeref(PySetObject *so, PyObject *key, Py_hash_t hash)
else if (entry->hash == -1) {
assert (entry->key == dummy);
freeslot = entry;
goto found_unused_or_dummy;
}
entry++;
} while (probes--);