churchyard / rpms / python2

Forked from rpms/python2 6 years ago
Clone
Iryna Shcherbina 6bc3f63
From ab35adc682ec51800aa19a77de9947c6aaa50f41 Mon Sep 17 00:00:00 2001
Iryna Shcherbina 6bc3f63
From: Victor Stinner <victor.stinner@gmail.com>
Iryna Shcherbina 6bc3f63
Date: Fri, 6 Oct 2017 22:28:59 +0200
Iryna Shcherbina 6bc3f63
Subject: [PATCH] bpo-31719: Fix test_regrtest.test_crashed() on s390x
Iryna Shcherbina 6bc3f63
Iryna Shcherbina 6bc3f63
Add a new _testcapi._read_null() function to crash Python in a
Iryna Shcherbina 6bc3f63
reliable way on s390x.
Iryna Shcherbina 6bc3f63
Iryna Shcherbina 6bc3f63
On s390x, ctypes.string_at(0) returns an empty string rather than
Iryna Shcherbina 6bc3f63
crashing.
Iryna Shcherbina 6bc3f63
---
Iryna Shcherbina 6bc3f63
 Lib/test/support/__init__.py                            |  4 ++--
Iryna Shcherbina 6bc3f63
 Lib/test/test_regrtest.py                               |  2 ++
Iryna Shcherbina 6bc3f63
 .../next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst |  3 +++
Iryna Shcherbina 6bc3f63
 Modules/_testcapimodule.c                               | 17 +++++++++++++++++
Iryna Shcherbina 6bc3f63
 4 files changed, 24 insertions(+), 2 deletions(-)
Iryna Shcherbina 6bc3f63
 create mode 100644 Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst
Iryna Shcherbina 6bc3f63
Iryna Shcherbina 6bc3f63
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
Iryna Shcherbina 6bc3f63
index ef474e00b68..25df3ed0c41 100644
Iryna Shcherbina 6bc3f63
--- a/Lib/test/support/__init__.py
Iryna Shcherbina 6bc3f63
+++ b/Lib/test/support/__init__.py
Iryna Shcherbina 6bc3f63
@@ -1960,6 +1960,6 @@ def _crash_python():
Iryna Shcherbina 6bc3f63
     Use SuppressCrashReport() to prevent a crash report from popping up.
Iryna Shcherbina 6bc3f63
     """
Iryna Shcherbina 6bc3f63
 
Iryna Shcherbina 6bc3f63
-    import ctypes
Iryna Shcherbina 6bc3f63
+    import _testcapi
Iryna Shcherbina 6bc3f63
     with SuppressCrashReport():
Iryna Shcherbina 6bc3f63
-        ctypes.string_at(0)
Iryna Shcherbina 6bc3f63
+        _testcapi._read_null()
Iryna Shcherbina 6bc3f63
diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
Iryna Shcherbina 6bc3f63
index 264c74d22ba..aae274384c7 100644
Iryna Shcherbina 6bc3f63
--- a/Lib/test/test_regrtest.py
Iryna Shcherbina 6bc3f63
+++ b/Lib/test/test_regrtest.py
Iryna Shcherbina 6bc3f63
@@ -543,6 +543,8 @@ def test_method2(self):
Iryna Shcherbina 6bc3f63
                                 testname)
Iryna Shcherbina 6bc3f63
         self.assertEqual(output.splitlines(), all_methods)
Iryna Shcherbina 6bc3f63
 
Iryna Shcherbina 6bc3f63
+    @unittest.skipIf(sys.platform.startswith('aix'),
Iryna Shcherbina 6bc3f63
+                     "support._crash_python() doesn't work on AIX")
Iryna Shcherbina 6bc3f63
     def test_crashed(self):
Iryna Shcherbina 6bc3f63
         # Any code which causes a crash
Iryna Shcherbina 6bc3f63
         code = 'import test.support; test.support._crash_python()'
Iryna Shcherbina 6bc3f63
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
Iryna Shcherbina 6bc3f63
new file mode 100644
Iryna Shcherbina 6bc3f63
index 00000000000..a06c5267251
Iryna Shcherbina 6bc3f63
--- /dev/null
Iryna Shcherbina 6bc3f63
+++ b/Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst
Iryna Shcherbina 6bc3f63
@@ -0,0 +1,3 @@
Iryna Shcherbina 6bc3f63
+Fix test_regrtest.test_crashed() on s390x. Add a new _testcapi._read_null()
Iryna Shcherbina 6bc3f63
+function to crash Python in a reliable way on s390x. On s390x,
Iryna Shcherbina 6bc3f63
+ctypes.string_at(0) returns an empty string rather than crashing.
Iryna Shcherbina 6bc3f63
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
Iryna Shcherbina 6bc3f63
index 7691b5188ff..5902de07823 100644
Iryna Shcherbina 6bc3f63
--- a/Modules/_testcapimodule.c
Iryna Shcherbina 6bc3f63
+++ b/Modules/_testcapimodule.c
Iryna Shcherbina 6bc3f63
@@ -2566,6 +2566,22 @@ py_w_stopcode(PyObject *self, PyObject *args)
Iryna Shcherbina 6bc3f63
 #endif
Iryna Shcherbina 6bc3f63
 
Iryna Shcherbina 6bc3f63
 
Iryna Shcherbina 6bc3f63
+/* Read memory from NULL (address 0) to raise a SIGSEGV or SIGBUS signal
Iryna Shcherbina 6bc3f63
+   depending on the platform. This function is used by
Iryna Shcherbina 6bc3f63
+   test.support._crash_python() to "crash" Python. */
Iryna Shcherbina 6bc3f63
+static PyObject *
Iryna Shcherbina 6bc3f63
+read_null(PyObject *self, PyObject *args)
Iryna Shcherbina 6bc3f63
+{
Iryna Shcherbina 6bc3f63
+    volatile int *x;
Iryna Shcherbina 6bc3f63
+    volatile int y;
Iryna Shcherbina 6bc3f63
+
Iryna Shcherbina 6bc3f63
+    x = NULL;
Iryna Shcherbina 6bc3f63
+    y = *x;
Iryna Shcherbina 6bc3f63
+    return PyLong_FromLong(y);
Iryna Shcherbina 6bc3f63
+
Iryna Shcherbina 6bc3f63
+}
Iryna Shcherbina 6bc3f63
+
Iryna Shcherbina 6bc3f63
+
Iryna Shcherbina 6bc3f63
 static PyMethodDef TestMethods[] = {
Iryna Shcherbina 6bc3f63
     {"raise_exception",         raise_exception,                 METH_VARARGS},
Iryna Shcherbina 6bc3f63
     {"set_errno",               set_errno,                       METH_VARARGS},
Iryna Shcherbina 6bc3f63
@@ -2685,6 +2701,7 @@ static PyMethodDef TestMethods[] = {
Iryna Shcherbina 6bc3f63
 #ifdef W_STOPCODE
Iryna Shcherbina 6bc3f63
     {"W_STOPCODE", py_w_stopcode, METH_VARARGS},
Iryna Shcherbina 6bc3f63
 #endif
Iryna Shcherbina 6bc3f63
+    {"_read_null", (PyCFunction)read_null, METH_NOARGS},
Iryna Shcherbina 6bc3f63
     {NULL, NULL} /* sentinel */
Iryna Shcherbina 6bc3f63
 };
Iryna Shcherbina 6bc3f63