[3.14] gh-140406: Fix memory leak upon __hash__ returning a non-integer (GH-140411) (GH-140417)

gh-140406: Fix memory leak upon `__hash__` returning a non-integer (GH-140411)
(cherry picked from commit 71db05a12d)

Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-10-21 14:35:31 +02:00 committed by GitHub
parent 98d4c21c09
commit c0f0eca4da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 0 deletions

View file

@ -1183,6 +1183,16 @@ def __hash__(self):
return self return self
self.assertEqual(hash(Z(42)), hash(42)) self.assertEqual(hash(Z(42)), hash(42))
def test_invalid_hash_typeerror(self):
# GH-140406: The returned object from __hash__() would leak if it
# wasn't an integer.
class A:
def __hash__(self):
return 1.0
with self.assertRaises(TypeError):
hash(A())
def test_hex(self): def test_hex(self):
self.assertEqual(hex(16), '0x10') self.assertEqual(hex(16), '0x10')
self.assertEqual(hex(-16), '-0x10') self.assertEqual(hex(-16), '-0x10')

View file

@ -0,0 +1,2 @@
Fix memory leak when an object's :meth:`~object.__hash__` method returns an
object that isn't an :class:`int`.

View file

@ -10195,6 +10195,7 @@ slot_tp_hash(PyObject *self)
return PyObject_HashNotImplemented(self); return PyObject_HashNotImplemented(self);
} }
if (!PyLong_Check(res)) { if (!PyLong_Check(res)) {
Py_DECREF(res);
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"__hash__ method should return an integer"); "__hash__ method should return an integer");
return -1; return -1;