diff options
author | bladebryan <bryan.olson@acm.org> | 2017-04-22 06:10:46 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-22 06:10:46 (GMT) |
commit | 9616a82e7802241a4b74cf7ae38d43c37bf66e48 (patch) | |
tree | 58586d87ce8abae757b2452074e4f71df6329ec5 /Modules | |
parent | 1a5856bf9295fa73995898d576e0bedf016aee1f (diff) | |
download | cpython-9616a82e7802241a4b74cf7ae38d43c37bf66e48.zip cpython-9616a82e7802241a4b74cf7ae38d43c37bf66e48.tar.gz cpython-9616a82e7802241a4b74cf7ae38d43c37bf66e48.tar.bz2 |
bpo-29960 _random.Random corrupted on exception in setstate(). (#1019)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_randommodule.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 6db1d2d..9953654 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -348,6 +348,7 @@ random_setstate(RandomObject *self, PyObject *state) int i; unsigned long element; long index; + uint32_t new_state[N]; if (!PyTuple_Check(state)) { PyErr_SetString(PyExc_TypeError, @@ -364,7 +365,7 @@ random_setstate(RandomObject *self, PyObject *state) element = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(state, i)); if (element == (unsigned long)-1 && PyErr_Occurred()) return NULL; - self->state[i] = (uint32_t)element; + new_state[i] = (uint32_t)element; } index = PyLong_AsLong(PyTuple_GET_ITEM(state, i)); @@ -375,6 +376,8 @@ random_setstate(RandomObject *self, PyObject *state) return NULL; } self->index = (int)index; + for (i = 0; i < N; i++) + self->state[i] = new_state[i]; Py_RETURN_NONE; } |