[3.6] bpo-29960 _random.Random corrupted on exception in setstate(). … (#1287)

(cherry picked from commit 9616a82e7802241a4b74cf7ae38d43c37bf66e48)
diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
index e5dd2c9..d006aeb 100644
--- a/Modules/_randommodule.c
+++ b/Modules/_randommodule.c
@@ -348,6 +348,7 @@
     int i;
     unsigned long element;
     long index;
+    uint32_t new_state[N];
 
     if (!PyTuple_Check(state)) {
         PyErr_SetString(PyExc_TypeError,
@@ -364,7 +365,7 @@
         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 @@
         return NULL;
     }
     self->index = (int)index;
+    for (i = 0; i < N; i++)
+        self->state[i] = new_state[i];
 
     Py_INCREF(Py_None);
     return Py_None;