summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na92@gmail.com>2020-06-21 09:44:58 (GMT)
committerGitHub <noreply@github.com>2020-06-21 09:44:58 (GMT)
commit6989af0bc7ea1e9a1acea16794e6f723d7b44110 (patch)
tree7a6a51cf05c62572ace0e1420cfa4a0317752931
parentf9bab74d5b34c64cf061e1629ff5f3092a4ca9b3 (diff)
downloadcpython-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.py10
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-06-20-22-46-18.bpo-41052.46MPeF.rst1
-rw-r--r--Modules/_randommodule.c18
-rw-r--r--Modules/clinic/_randommodule.c.h19
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]*/