Browse Source

bpo-38075: Fix random_seed(): use PyObject_CallOneArg() (GH-18897)

Fix the random.Random.seed() method when a bool is passed as the
seed.

PyObject_Vectorcall() was misused: use PyObject_CallOneArg() instead.
pull/18889/merge
Victor Stinner 6 years ago
committed by GitHub
parent
commit
00d7cd8ab8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Lib/test/test_random.py
  2. 2
      Misc/NEWS.d/next/Library/2020-03-10-12-52-06.bpo-38075.qbESAF.rst
  3. 5
      Modules/_randommodule.c

2
Lib/test/test_random.py

@ -42,7 +42,7 @@ class TestBasicOps:
def __hash__(self): def __hash__(self):
return -1729 return -1729
for arg in [None, 0, 1, -1, 10**20, -(10**20), for arg in [None, 0, 1, -1, 10**20, -(10**20),
3.14, 'a']:
False, True, 3.14, 'a']:
self.gen.seed(arg) self.gen.seed(arg)
for arg in [1+2j, tuple('abc'), MySeed()]: for arg in [1+2j, tuple('abc'), MySeed()]:

2
Misc/NEWS.d/next/Library/2020-03-10-12-52-06.bpo-38075.qbESAF.rst

@ -0,0 +1,2 @@
Fix the :meth:`random.Random.seed` method when a :class:`bool` is passed as the
seed.

5
Modules/_randommodule.c

@ -264,7 +264,6 @@ random_seed(RandomObject *self, PyObject *arg)
uint32_t *key = NULL; uint32_t *key = NULL;
size_t bits, keyused; size_t bits, keyused;
int res; int res;
PyObject *args[1];
if (arg == NULL || arg == Py_None) { if (arg == NULL || arg == Py_None) {
if (random_seed_urandom(self) < 0) { if (random_seed_urandom(self) < 0) {
@ -286,9 +285,7 @@ random_seed(RandomObject *self, PyObject *arg)
} else if (PyLong_Check(arg)) { } else if (PyLong_Check(arg)) {
/* Calling int.__abs__() prevents calling arg.__abs__(), which might /* Calling int.__abs__() prevents calling arg.__abs__(), which might
return an invalid value. See issue #31478. */ return an invalid value. See issue #31478. */
args[0] = arg;
n = PyObject_Vectorcall(_randomstate_global->Long___abs__, args, 0,
NULL);
n = PyObject_CallOneArg(_randomstate_global->Long___abs__, arg);
} }
else { else {
Py_hash_t hash = PyObject_Hash(arg); Py_hash_t hash = PyObject_Hash(arg);

Loading…
Cancel
Save