From 01b9664740307b39c2907bd84cbb0b2c35be9df4 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 30 Dec 2018 17:59:19 -0800 Subject: 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 --- Modules/socketmodule.c | 20 ++++++++++++++++++++ Modules/timemodule.c | 7 +++++++ 2 files changed, 27 insertions(+) (limited to 'Modules') diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index e6d3f8be6e..661e1bdf57 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 +#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 13a174a4ea..5e99bd82d1 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -34,6 +34,10 @@ #endif /* MS_WINDOWS */ #endif /* !__WATCOMC__ || __QNX__ */ +#ifdef _Py_MEMORY_SANITIZER +# include +#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); } -- cgit v1.2.1