import signal
import subprocess
import sys
+import sysconfig
from test import support
from test.support import script_helper, is_android
import tempfile
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
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:
@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:
--- /dev/null
+clang Memory Sanitizer build instrumentation was added to work around false
+positives from socket, time, and test_faulthandler.
#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\
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);
#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 */
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+#ifdef _Py_MEMORY_SANITIZER
+ __msan_unpoison(&clk_id, sizeof(clk_id));
+#endif
return PyLong_FromLong(clk_id);
}