bpo-35214: Annotate posix calls for clang MSan. (#11389)

It doesn't know the details of a few less common libc functions.
This commit is contained in:
Gregory P. Smith 2018-12-30 21:13:02 -08:00 committed by GitHub
parent e5796c42c6
commit 1d300ce1d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 1 deletions

View File

@ -1,2 +1,2 @@
clang Memory Sanitizer build instrumentation was added to work around false clang Memory Sanitizer build instrumentation was added to work around false
positives from socket, time, test_io, and test_faulthandler. positives from posix, socket, time, test_io, and test_faulthandler.

View File

@ -367,6 +367,10 @@ static int win32_can_symlink = 0;
#define HAVE_STRUCT_STAT_ST_FSTYPE 1 #define HAVE_STRUCT_STAT_ST_FSTYPE 1
#endif #endif
#ifdef _Py_MEMORY_SANITIZER
# include <sanitizer/msan_interface.h>
#endif
#ifdef HAVE_FORK #ifdef HAVE_FORK
static void static void
run_at_forkers(PyObject *lst, int reverse) run_at_forkers(PyObject *lst, int reverse)
@ -5493,6 +5497,9 @@ os_posix_spawn_impl(PyObject *module, path_t *path, PyObject *argv,
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object); PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object);
goto exit; goto exit;
} }
#ifdef _Py_MEMORY_SANITIZER
__msan_unpoison(&pid, sizeof(pid));
#endif
result = PyLong_FromPid(pid); result = PyLong_FromPid(pid);
exit: exit:
@ -6098,6 +6105,9 @@ os_sched_rr_get_interval_impl(PyObject *module, pid_t pid)
posix_error(); posix_error();
return -1.0; return -1.0;
} }
#ifdef _Py_MEMORY_SANITIZER
__msan_unpoison(&interval, sizeof(interval));
#endif
return (double)interval.tv_sec + 1e-9*interval.tv_nsec; return (double)interval.tv_sec + 1e-9*interval.tv_nsec;
} }
#endif /* HAVE_SCHED_RR_GET_INTERVAL */ #endif /* HAVE_SCHED_RR_GET_INTERVAL */
@ -6568,6 +6578,12 @@ posix_getgrouplist(PyObject *self, PyObject *args)
return posix_error(); return posix_error();
} }
#ifdef _Py_MEMORY_SANITIZER
/* Clang memory sanitizer libc intercepts don't know getgrouplist. */
__msan_unpoison(&ngroups, sizeof(ngroups));
__msan_unpoison(groups, ngroups*sizeof(*groups));
#endif
list = PyList_New(ngroups); list = PyList_New(ngroups);
if (list == NULL) { if (list == NULL) {
PyMem_Del(groups); PyMem_Del(groups);