summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Tests/2018-12-26-12-31-16.bpo-34720.T268vz.rst2
-rw-r--r--Modules/_testmultiphase.c8
2 files changed, 10 insertions, 0 deletions
diff --git a/Misc/NEWS.d/next/Tests/2018-12-26-12-31-16.bpo-34720.T268vz.rst b/Misc/NEWS.d/next/Tests/2018-12-26-12-31-16.bpo-34720.T268vz.rst
new file mode 100644
index 0000000..fc49028
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2018-12-26-12-31-16.bpo-34720.T268vz.rst
@@ -0,0 +1,2 @@
+Assert m_state != NULL to mimic GC traversal functions that do not correctly
+handle module creation when the module state has not been created.
diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c
index 5776df7..c6dfc2f 100644
--- a/Modules/_testmultiphase.c
+++ b/Modules/_testmultiphase.c
@@ -624,6 +624,14 @@ bad_traverse(PyObject *self, visitproc visit, void *arg) {
testmultiphase_state *m_state;
m_state = PyModule_GetState(self);
+
+ /* The following assertion mimics any traversal function that doesn't correctly handle
+ * the case during module creation where the module state hasn't been created yet.
+ *
+ * The check that it is used to test only runs in debug mode, so it is OK that the
+ * assert() will get compiled out in fully optimised release builds.
+ */
+ assert(m_state != NULL);
Py_VISIT(m_state->integer);
return 0;
}