['0x1.b0580f98a7dbep-1', '0x1.84129978f9c1ap-1',
'0x1.aeaa51052e978p-2', '0x1.092178fb945a6p-2'])
+ def test_bug_31478(self):
+ # There shouldn't be an assertion failure in _random.Random.seed() in
+ # case the argument has a bad __abs__() method.
+ class BadInt(int):
+ def __abs__(self):
+ return None
+ try:
+ self.gen.seed(BadInt())
+ except TypeError:
+ pass
+
def test_bug_31482(self):
# Verify that version 1 seeds are unaffected by hash randomization
# when the seeds are expressed as bytes rather than strings.
* So: if the arg is a PyLong, use its absolute value.
* Otherwise use its hash value, cast to unsigned.
*/
- if (PyLong_Check(arg))
- n = PyNumber_Absolute(arg);
+ if (PyLong_Check(arg)) {
+ /* Calling int.__abs__() prevents calling arg.__abs__(), which might
+ return an invalid value. See issue #31478. */
+ n = PyLong_Type.tp_as_number->nb_absolute(arg);
+ }
else {
Py_hash_t hash = PyObject_Hash(arg);
if (hash == -1)