]> granicus.if.org Git - python/commitdiff
bpo-31719: Fix test_regrtest.test_crashed() on s390x (#3912)
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 9 Oct 2017 07:52:06 +0000 (00:52 -0700)
committerGitHub <noreply@github.com>
Mon, 9 Oct 2017 07:52:06 +0000 (00:52 -0700)
Add a new _testcapi._read_null() function to crash Python in a
reliable way on s390x.

On s390x, ctypes.string_at(0) returns an empty string rather than
crashing.

Lib/test/support/__init__.py
Lib/test/test_regrtest.py
Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst [new file with mode: 0644]
Modules/_testcapimodule.c

index ef474e00b68cc3b6c174cc07eb98625b745d8d6e..25df3ed0c414931a3d97c6e6c19d4d9aad4db739 100644 (file)
@@ -1960,6 +1960,6 @@ def _crash_python():
     Use SuppressCrashReport() to prevent a crash report from popping up.
     """
 
-    import ctypes
+    import _testcapi
     with SuppressCrashReport():
-        ctypes.string_at(0)
+        _testcapi._read_null()
index 264c74d22ba7e47483e7cda5c5723eec82ee1282..aae274384c738d0e64a081d9b3b61a3b1e93e9d1 100644 (file)
@@ -543,6 +543,8 @@ class ArgsTestCase(BaseTestCase):
                                 testname)
         self.assertEqual(output.splitlines(), all_methods)
 
+    @unittest.skipIf(sys.platform.startswith('aix'),
+                     "support._crash_python() doesn't work on AIX")
     def test_crashed(self):
         # Any code which causes a crash
         code = 'import test.support; test.support._crash_python()'
diff --git a/Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst b/Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst
new file mode 100644 (file)
index 0000000..a06c526
--- /dev/null
@@ -0,0 +1,3 @@
+Fix test_regrtest.test_crashed() on s390x. Add a new _testcapi._read_null()
+function to crash Python in a reliable way on s390x. On s390x,
+ctypes.string_at(0) returns an empty string rather than crashing.
index 7691b5188ff2ec57c794d741c1f3bef99176c87c..5902de078230de071656f824b78ae77e561cee5b 100644 (file)
@@ -2566,6 +2566,22 @@ py_w_stopcode(PyObject *self, PyObject *args)
 #endif
 
 
+/* Read memory from NULL (address 0) to raise a SIGSEGV or SIGBUS signal
+   depending on the platform. This function is used by
+   test.support._crash_python() to "crash" Python. */
+static PyObject *
+read_null(PyObject *self, PyObject *args)
+{
+    volatile int *x;
+    volatile int y;
+
+    x = NULL;
+    y = *x;
+    return PyLong_FromLong(y);
+
+}
+
+
 static PyMethodDef TestMethods[] = {
     {"raise_exception",         raise_exception,                 METH_VARARGS},
     {"set_errno",               set_errno,                       METH_VARARGS},
@@ -2685,6 +2701,7 @@ static PyMethodDef TestMethods[] = {
 #ifdef W_STOPCODE
     {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
 #endif
+    {"_read_null", (PyCFunction)read_null, METH_NOARGS},
     {NULL, NULL} /* sentinel */
 };