summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-09-28 09:17:51 (GMT)
committerGitHub <noreply@github.com>2017-09-28 09:17:51 (GMT)
commitbefc956acf8ddeb94f000ed081ddec51315429e5 (patch)
treecf34b0e10b6959622d7969bb43ad8f4bbb01553f
parent68b131d5b674549bb637b366730497714ad11328 (diff)
downloadcpython-befc956acf8ddeb94f000ed081ddec51315429e5.zip
cpython-befc956acf8ddeb94f000ed081ddec51315429e5.tar.gz
cpython-befc956acf8ddeb94f000ed081ddec51315429e5.tar.bz2
[3.6] bpo-31478: Fix an assertion failure in random.seed() in case a seed has a bad __abs__() method. (GH-3596) (#3794)
(cherry picked from commit d780b2d588e68bd7047ef5d1f04e36da38b7a350)
-rw-r--r--Lib/test/test_random.py11
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2017-09-15-09-13-07.bpo-31478.o06iKD.rst2
-rw-r--r--Modules/_randommodule.c7
3 files changed, 18 insertions, 2 deletions
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index a2d9a96..b42bf2a 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -423,6 +423,17 @@ class MersenneTwister_TestBasicOps(TestBasicOps, unittest.TestCase):
['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.
diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-09-15-09-13-07.bpo-31478.o06iKD.rst b/Misc/NEWS.d/next/Core and Builtins/2017-09-15-09-13-07.bpo-31478.o06iKD.rst
new file mode 100644
index 0000000..bbeb810
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2017-09-15-09-13-07.bpo-31478.o06iKD.rst
@@ -0,0 +1,2 @@
+Fix an assertion failure in `_random.Random.seed()` in case the argument has a
+bad ``__abs__()`` method. Patch by Oren Milman.
diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
index d006aeb..769084f 100644
--- a/Modules/_randommodule.c
+++ b/Modules/_randommodule.c
@@ -259,8 +259,11 @@ random_seed(RandomObject *self, PyObject *args)
* 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)