[Python-checkins] bpo-35214: MSan workarounds for socket, time, and test_faulthandler. (GH-11375) (GH-11378)

Gregory P. Smith webhook-mailer at python.org
Sun Dec 30 20:59:22 EST 2018


https://github.com/python/cpython/commit/01b9664740307b39c2907bd84cbb0b2c35be9df4
commit: 01b9664740307b39c2907bd84cbb0b2c35be9df4
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Gregory P. Smith <greg at krypto.org>
date: 2018年12月30日T17:59:19-08:00
summary:
bpo-35214: MSan workarounds for socket, time, and test_faulthandler. (GH-11375) (GH-11378)
Add Clang Memory Sanitizer build instrumentation to work around
false positives from the socket and time modules as well as skipping
a couple test_faulthandler tests.
(cherry picked from commit b474e6774d60fa67d5373e361a0ed53c18b24f53)
Co-authored-by: Gregory P. Smith <greg at krypto.org>
files:
A Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst
M Lib/test/test_faulthandler.py
M Modules/socketmodule.c
M Modules/timemodule.c
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index d6dc4ba55d9b..984690f248ba 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -5,6 +5,7 @@
 import signal
 import subprocess
 import sys
+import sysconfig
 from test import support
 from test.support import script_helper, is_android
 import tempfile
@@ -19,6 +20,10 @@
 
 TIMEOUT = 0.5
 MS_WINDOWS = (os.name == 'nt')
+MEMORY_SANITIZER = (
+ sysconfig.get_config_var("CONFIG_ARGS") and
+ ("--with-memory-sanitizer" in sysconfig.get_config_var("CONFIG_ARGS"))
+)
 
 def expected_traceback(lineno1, lineno2, header, min_count=1):
 regex = header
@@ -252,6 +257,8 @@ def test_gil_released(self):
 3,
 'Segmentation fault')
 
+ @unittest.skipIf(MEMORY_SANITIZER,
+ "memory-sanizer builds change crashing process output.")
 @skip_segfault_on_android
 def test_enable_file(self):
 with temporary_filename() as filename:
@@ -267,6 +274,8 @@ def test_enable_file(self):
 
 @unittest.skipIf(sys.platform == "win32",
 "subprocess doesn't support pass_fds on Windows")
+ @unittest.skipIf(MEMORY_SANITIZER,
+ "memory-sanizer builds change crashing process output.")
 @skip_segfault_on_android
 def test_enable_fd(self):
 with tempfile.TemporaryFile('wb+') as fp:
diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst
new file mode 100644
index 000000000000..d2e5457842b7
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-30-15-36-23.bpo-35214.GWDQcv.rst	
@@ -0,0 +1,2 @@
+clang Memory Sanitizer build instrumentation was added to work around false
+positives from socket, time, and test_faulthandler.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index e6d3f8be6ede..661e1bdf5784 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -100,6 +100,10 @@ Local naming conventions:
 #include "Python.h"
 #include "structmember.h"
 
+#ifdef _Py_MEMORY_SANITIZER
+# include <sanitizer/msan_interface.h>
+#endif
+
 /* Socket object documentation */
 PyDoc_STRVAR(sock_doc,
 "socket(family=AF_INET, type=SOCK_STREAM, proto=0) -> socket object\n\
@@ -6463,7 +6467,23 @@ socket_if_nameindex(PyObject *self, PyObject *arg)
 return NULL;
 }
 
+#ifdef _Py_MEMORY_SANITIZER
+ __msan_unpoison(ni, sizeof(ni));
+ __msan_unpoison(&ni[0], sizeof(ni[0]));
+#endif
 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
+#ifdef _Py_MEMORY_SANITIZER
+ /* This one isn't the end sentinel, the next one must exist. */
+ __msan_unpoison(&ni[i+1], sizeof(ni[0]));
+ /* Otherwise Py_BuildValue internals are flagged by MSan when
+ they access the not-msan-tracked if_name string data. */
+ {
+ char *to_sanitize = ni[i].if_name;
+ do {
+ __msan_unpoison(to_sanitize, 1);
+ } while (*to_sanitize++ != '0円');
+ }
+#endif
 PyObject *ni_tuple = Py_BuildValue("IO&",
 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
 
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 13a174a4ea87..5e99bd82d1de 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -34,6 +34,10 @@
 #endif /* MS_WINDOWS */
 #endif /* !__WATCOMC__ || __QNX__ */
 
+#ifdef _Py_MEMORY_SANITIZER
+# include <sanitizer/msan_interface.h>
+#endif
+
 #define SEC_TO_NS (1000 * 1000 * 1000)
 
 /* Forward declarations */
@@ -331,6 +335,9 @@ time_pthread_getcpuclockid(PyObject *self, PyObject *args)
 PyErr_SetFromErrno(PyExc_OSError);
 return NULL;
 }
+#ifdef _Py_MEMORY_SANITIZER
+ __msan_unpoison(&clk_id, sizeof(clk_id));
+#endif
 return PyLong_FromLong(clk_id);
 }
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /