diff options
author | Dong-hee Na <donghee.na92@gmail.com> | 2020-06-21 09:44:58 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-21 09:44:58 (GMT) |
commit | 6989af0bc7ea1e9a1acea16794e6f723d7b44110 (patch) | |
tree | 7a6a51cf05c62572ace0e1420cfa4a0317752931 | |
parent | f9bab74d5b34c64cf061e1629ff5f3092a4ca9b3 (diff) | |
download | cpython-6989af0bc7ea1e9a1acea16794e6f723d7b44110.zip cpython-6989af0bc7ea1e9a1acea16794e6f723d7b44110.tar.gz cpython-6989af0bc7ea1e9a1acea16794e6f723d7b44110.tar.bz2 |
bpo-41052: Opt out serialization/deserialization for _random.Random (GH-21002)
-rw-r--r-- | Lib/test/test_random.py | 10 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst | 1 | ||||
-rw-r--r-- | Modules/_randommodule.c | 18 | ||||
-rw-r--r-- | Modules/clinic/_randommodule.c.h | 19 |
4 files changed, 47 insertions, 1 deletions
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index a3710f4..a80e71e 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -5,6 +5,8 @@ import os import time import pickle import warnings +import test.support + from functools import partial from math import log, exp, pi, fsum, sin, factorial from test import support @@ -372,6 +374,14 @@ class TestBasicOps: restoredseq = [newgen.random() for i in range(10)] self.assertEqual(origseq, restoredseq) + @test.support.cpython_only + def test_bug_41052(self): + # _random.Random should not be allowed to serialization + import _random + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + r = _random.Random() + self.assertRaises(TypeError, pickle.dumps, r, proto) + def test_bug_1727780(self): # verify that version-2-pickles can be loaded # fine, whether they are created on 32-bit or 64-bit diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst new file mode 100644 index 0000000..82969bf --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst @@ -0,0 +1 @@ +Opt out serialization/deserialization for _random.Random diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 3e3139e..b8bc044 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -535,12 +535,30 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)self; } + +/*[clinic input] + +_random.Random.__reduce__ + +[clinic start generated code]*/ + +static PyObject * +_random_Random___reduce___impl(RandomObject *self) +/*[clinic end generated code: output=ddea0dcdb60ffd6d input=bd38ec35fd157e0f]*/ +{ + PyErr_Format(PyExc_TypeError, + "cannot pickle %s object", + Py_TYPE(self)->tp_name); + return NULL; +} + static PyMethodDef random_methods[] = { _RANDOM_RANDOM_RANDOM_METHODDEF _RANDOM_RANDOM_SEED_METHODDEF _RANDOM_RANDOM_GETSTATE_METHODDEF _RANDOM_RANDOM_SETSTATE_METHODDEF _RANDOM_RANDOM_GETRANDBITS_METHODDEF + _RANDOM_RANDOM___REDUCE___METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/clinic/_randommodule.c.h b/Modules/clinic/_randommodule.c.h index b3cd435..3322a37 100644 --- a/Modules/clinic/_randommodule.c.h +++ b/Modules/clinic/_randommodule.c.h @@ -109,4 +109,21 @@ _random_Random_getrandbits(RandomObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=cc8a23b2757dc6ba input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_random_Random___reduce____doc__, +"__reduce__($self, /)\n" +"--\n" +"\n"); + +#define _RANDOM_RANDOM___REDUCE___METHODDEF \ + {"__reduce__", (PyCFunction)_random_Random___reduce__, METH_NOARGS, _random_Random___reduce____doc__}, + +static PyObject * +_random_Random___reduce___impl(RandomObject *self); + +static PyObject * +_random_Random___reduce__(RandomObject *self, PyObject *Py_UNUSED(ignored)) +{ + return _random_Random___reduce___impl(self); +} +/*[clinic end generated code: output=450f0961c2c92389 input=a9049054013a1b77]*/ |