From 36cc9827dd47f213bb17dd7e37b3b19b740a0928 Mon Sep 17 00:00:00 2001 From: marxin Date: Fri, 31 Mar 2017 10:28:25 +0200 Subject: [PATCH] Cherry-pick upstream r299036 from libsanitizer (PR sanitizer/80166). libsanitizer/ChangeLog: 2017-03-31 Martin Liska * sanitizer_common/sanitizer_common_interceptors.inc (INTERCEPTOR): Cherry-pick upstream r299036. gcc/testsuite/ChangeLog: 2017-03-31 Martin Liska * gcc.dg/asan/pr80166.c: New test. --- gcc/testsuite/gcc.dg/asan/pr80166.c | 24 ++++++++++++++++++++++ .../sanitizer_common_interceptors.inc | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/asan/pr80166.c diff --git a/gcc/testsuite/gcc.dg/asan/pr80166.c b/gcc/testsuite/gcc.dg/asan/pr80166.c new file mode 100644 index 00000000000..629dd23a31c --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/pr80166.c @@ -0,0 +1,24 @@ +/* PR sanitizer/80166 */ +/* { dg-do run } */ + +#include +#include + +int +main (int argc, char **argv) +{ + gid_t groups; + int r = getgroups (0, &groups); + if (r < 0) + __builtin_abort (); + + r = getgroups (-1, &groups); + if (r != -1) + __builtin_abort (); + + r = getgroups (-1, NULL); + if (r != -1) + __builtin_abort (); + + return 0; +} diff --git a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc index 0970eda5ee6..195014022a0 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc +++ b/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc @@ -3350,7 +3350,8 @@ INTERCEPTOR(int, getgroups, int size, u32 *lst) { // its metadata. See // https://github.com/google/sanitizers/issues/321. int res = REAL(getgroups)(size, lst); - if (res && lst) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lst, res * sizeof(*lst)); + if (res >= 0 && lst && size > 0) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lst, res * sizeof(*lst)); return res; } #define INIT_GETGROUPS COMMON_INTERCEPT_FUNCTION(getgroups); -- 2.12.0