[compiler-rt] r348293 - [Sanitizer] intercept part of sysctl Api

Vlad Tsyrklevich via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 4 14:54:00 PST 2018


I just noticed that you had already committed a fix at this point and I
missed it, sorry about the false alarm.

On Tue, Dec 4, 2018 at 1:17 PM Vlad Tsyrklevich <vlad at tsyrklevich.net>
wrote:

> This change broke sanitizer-x86_64-linux:
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/17971/steps/ninja%20check-sanitizer/logs/stdio
>
>
> On Tue, Dec 4, 2018 at 11:03 AM David Carlier via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: devnexen
>> Date: Tue Dec  4 11:00:38 2018
>> New Revision: 348293
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=348293&view=rev
>> Log:
>>
>>
>> [Sanitizer] intercept part of sysctl Api
>>
>> - Distringuish what FreeBSD/NetBSD can and NetBSD specifics.
>> - Fixing page size value collection.
>>
>> Reviewers: krytarowski, vitalybuka
>>
>> Reviewed By: krytarowski
>>
>> Differential Revision: https://reviews.llvm.org/D55265
>>
>> Added:
>>     compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/sysctl.cc
>>       - copied, changed from r348292,
>> compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc
>> Removed:
>>     compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc
>> Modified:
>>
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
>>
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=348293&r1=348292&r2=348293&view=diff
>>
>> ==============================================================================
>> ---
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>> (original)
>> +++
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>> Tue Dec  4 11:00:38 2018
>> @@ -7568,36 +7568,6 @@ INTERCEPTOR(int, sysctlbyname, char *sna
>>    return res;
>>  }
>>
>> -INTERCEPTOR(int, sysctlgetmibinfo, char *sname, int *name,
>> -            unsigned int *namelenp, char *cname, SIZE_T *csz, void
>> **rnode,
>> -            int v) {
>> -  void *ctx;
>> -  COMMON_INTERCEPTOR_ENTER(ctx, sysctlgetmibinfo, sname, name, namelenp,
>> cname,
>> -                           csz, rnode, v);
>> -  if (sname)
>> -    COMMON_INTERCEPTOR_READ_RANGE(ctx, sname, REAL(strlen)(sname) + 1);
>> -  if (namelenp)
>> -    COMMON_INTERCEPTOR_READ_RANGE(ctx, namelenp, sizeof(*namelenp));
>> -  if (csz)
>> -    COMMON_INTERCEPTOR_READ_RANGE(ctx, csz, sizeof(*csz));
>> -  // Skip rnode, it's rarely used and not trivial to sanitize
>> -  // It's also used mostly internally
>> -  int res = REAL(sysctlgetmibinfo)(sname, name, namelenp, cname, csz,
>> rnode, v);
>> -  if (!res) {
>> -    if (namelenp) {
>> -      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, namelenp, sizeof(*namelenp));
>> -      if (name)
>> -        COMMON_INTERCEPTOR_WRITE_RANGE(ctx, name, *namelenp *
>> sizeof(*name));
>> -    }
>> -    if (csz) {
>> -      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, csz, sizeof(*csz));
>> -      if (cname)
>> -        COMMON_INTERCEPTOR_WRITE_RANGE(ctx, cname, *csz);
>> -    }
>> -  }
>> -  return res;
>> -}
>> -
>>  INTERCEPTOR(int, sysctlnametomib, const char *sname, int *name,
>>              SIZE_T *namelenp) {
>>    void *ctx;
>> @@ -7617,6 +7587,15 @@ INTERCEPTOR(int, sysctlnametomib, const
>>    return res;
>>  }
>>
>> +#define INIT_SYSCTL                        \
>> +  COMMON_INTERCEPT_FUNCTION(sysctl);       \
>> +  COMMON_INTERCEPT_FUNCTION(sysctlbyname); \
>> +  COMMON_INTERCEPT_FUNCTION(sysctlnametomib);
>> +#else
>> +#define INIT_SYSCTL
>> +#endif
>> +
>> +#if SANITIZER_INTERCEPT_ASYSCTL
>>  INTERCEPTOR(void *, asysctl, const int *name, SIZE_T namelen, SIZE_T
>> *len) {
>>    void *ctx;
>>    COMMON_INTERCEPTOR_ENTER(ctx, asysctl, name, namelen, len);
>> @@ -7642,17 +7621,50 @@ INTERCEPTOR(void *, asysctlbyname, const
>>    }
>>    return res;
>>  }
>> -#define INIT_SYSCTL
>>       \
>> -  COMMON_INTERCEPT_FUNCTION(sysctl);
>>        \
>> -  COMMON_INTERCEPT_FUNCTION(sysctlbyname);
>>        \
>> -  COMMON_INTERCEPT_FUNCTION(sysctlgetmibinfo);
>>        \
>> -  COMMON_INTERCEPT_FUNCTION(sysctlnametomib);
>>       \
>> -  COMMON_INTERCEPT_FUNCTION(asysctl);
>>       \
>> +#define INIT_ASYSCTL                           \
>> +  COMMON_INTERCEPT_FUNCTION(asysctl);          \
>>    COMMON_INTERCEPT_FUNCTION(asysctlbyname);
>>  #else
>> -#define INIT_SYSCTL
>> +#define INIT_ASYSCTL
>> +#endif
>> +
>> +#if SANITIZER_INTERCEPT_SYSCTLGETMIBINFO
>> +INTERCEPTOR(int, sysctlgetmibinfo, char *sname, int *name,
>> +            unsigned int *namelenp, char *cname, SIZE_T *csz, void
>> **rnode,
>> +            int v) {
>> +  void *ctx;
>> +  COMMON_INTERCEPTOR_ENTER(ctx, sysctlgetmibinfo, sname, name, namelenp,
>> cname,
>> +                           csz, rnode, v);
>> +  if (sname)
>> +    COMMON_INTERCEPTOR_READ_RANGE(ctx, sname, REAL(strlen)(sname) + 1);
>> +  if (namelenp)
>> +    COMMON_INTERCEPTOR_READ_RANGE(ctx, namelenp, sizeof(*namelenp));
>> +  if (csz)
>> +    COMMON_INTERCEPTOR_READ_RANGE(ctx, csz, sizeof(*csz));
>> +  // Skip rnode, it's rarely used and not trivial to sanitize
>> +  // It's also used mostly internally
>> +  int res = REAL(sysctlgetmibinfo)(sname, name, namelenp, cname, csz,
>> rnode, v);
>> +  if (!res) {
>> +    if (namelenp) {
>> +      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, namelenp, sizeof(*namelenp));
>> +      if (name)
>> +        COMMON_INTERCEPTOR_WRITE_RANGE(ctx, name, *namelenp *
>> sizeof(*name));
>> +    }
>> +    if (csz) {
>> +      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, csz, sizeof(*csz));
>> +      if (cname)
>> +        COMMON_INTERCEPTOR_WRITE_RANGE(ctx, cname, *csz);
>> +    }
>> +  }
>> +  return res;
>> +}
>> +#define INIT_SYSCTLGETMIBINFO                  \
>> +  COMMON_INTERCEPT_FUNCTION(sysctlgetmibinfo);
>> +#else
>> +#define INIT_SYSCTLGETMIBINFO
>>  #endif
>>
>> +
>>  static void InitializeCommonInterceptors() {
>>    static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
>>    interceptor_metadata_map = new((void *)&metadata_mem)
>> MetadataHashMap();
>> @@ -7913,6 +7925,8 @@ static void InitializeCommonInterceptors
>>    INIT_REGEX;
>>    INIT_FTS;
>>    INIT_SYSCTL;
>> +  INIT_ASYSCTL;
>> +  INIT_SYSCTLGETMIBINFO;
>>
>>    INIT___PRINTF_CHK;
>>  }
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=348293&r1=348292&r2=348293&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Tue Dec  4
>> 11:00:38 2018
>> @@ -772,7 +772,7 @@ int internal_sysctl(const int *name, uns
>>    return sysctl(name, namelen, oldp, (size_t *)oldlenp, (void *)newp,
>>                  (size_t)newlen);
>>  #else
>> -  return sysctl(name, namelen, oldp, (size_t *)oldlenp, newp,
>> (size_t)newlen);
>> +  return internal_syscall(SYSCALL(__sysctl), name, namelen, oldp,
>> (size_t *)oldlenp, newp, (size_t)newlen);
>>  #endif
>>  }
>>
>> @@ -1076,6 +1076,14 @@ uptr GetPageSize() {
>>    return EXEC_PAGESIZE;
>>  #elif SANITIZER_USE_GETAUXVAL
>>    return getauxval(AT_PAGESZ);
>> +#elif SANITIZER_FREEBSD || SANITIZER_NETBSD
>> +// Use sysctl as sysconf can trigger interceptors internally.
>> +  int pz = 0;
>> +  uptr pzl = sizeof(pz);
>> +  int mib[2] = {CTL_HW, HW_PAGESIZE};
>> +  int rv = internal_sysctl(mib, 2, &pz, &pzl, nullptr, 0);
>> +  CHECK_EQ(rv, 0);
>> +  return (uptr)pz;
>>  #else
>>    return sysconf(_SC_PAGESIZE);  // EXEC_PAGESIZE may not be trustworthy.
>>  #endif
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=348293&r1=348292&r2=348293&view=diff
>>
>> ==============================================================================
>> ---
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
>> (original)
>> +++
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
>> Tue Dec  4 11:00:38 2018
>> @@ -523,6 +523,8 @@
>>  #define SANITIZER_INTERCEPT_GETVFSSTAT SI_NETBSD
>>  #define SANITIZER_INTERCEPT_REGEX SI_NETBSD
>>  #define SANITIZER_INTERCEPT_FTS SI_NETBSD
>> -#define SANITIZER_INTERCEPT_SYSCTL SI_NETBSD
>> +#define SANITIZER_INTERCEPT_SYSCTL (SI_NETBSD || SI_FREEBSD)
>> +#define SANITIZER_INTERCEPT_ASYSCTL SI_NETBSD
>> +#define SANITIZER_INTERCEPT_SYSCTLGETMIBINFO SI_NETBSD
>>
>>  #endif  // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H
>>
>> Removed:
>> compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc?rev=348292&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc
>> (original)
>> +++ compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc
>> (removed)
>> @@ -1,101 +0,0 @@
>> -// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
>> -
>> -#include <sys/param.h>
>> -#include <sys/types.h>
>> -
>> -#include <sys/sysctl.h>
>> -
>> -#include <assert.h>
>> -#include <stdio.h>
>> -#include <stdlib.h>
>> -
>> -void test_sysctl() {
>> -  char buf[100];
>> -  size_t len = sizeof(buf);
>> -  int mib[] = {CTL_KERN, KERN_OSTYPE};
>> -  int rv = sysctl(mib, __arraycount(mib), buf, &len, NULL, 0);
>> -  assert(!rv);
>> -
>> -  printf("sysctl: '%s' size: '%zu'\n", buf, len);
>> -}
>> -
>> -void test_sysctlbyname() {
>> -  char buf[100];
>> -  size_t len = sizeof(buf);
>> -  int mib[] = {CTL_KERN, KERN_OSTYPE};
>> -  int rv = sysctlbyname("kern.ostype", buf, &len, NULL, 0);
>> -  assert(!rv);
>> -
>> -  printf("sysctlbyname: '%s' size: '%zu'\n", buf, len);
>> -}
>> -
>> -void test_sysctlgetmibinfo() {
>> -  int mib[CTL_MAXNAME];
>> -  unsigned int mib_len = __arraycount(mib);
>> -  int rv = sysctlgetmibinfo("kern.ostype", &mib[0], &mib_len, NULL,
>> NULL, NULL,
>> -                       SYSCTL_VERSION);
>> -  assert(!rv);
>> -
>> -  char buf[100];
>> -  size_t len = sizeof(buf);
>> -  rv = sysctl(mib, mib_len, buf, &len, NULL, 0);
>> -  assert(!rv);
>> -
>> -  printf("sysctlgetmibinfo: '%s' size: '%zu'\n", buf, len);
>> -}
>> -
>> -void test_sysctlnametomib() {
>> -  int mib[CTL_MAXNAME];
>> -  size_t mib_len = __arraycount(mib);
>> -  int rv = sysctlnametomib("kern.ostype", &mib[0], &mib_len);
>> -  assert(!rv);
>> -
>> -  char buf[100];
>> -  size_t len = sizeof(buf);
>> -  rv = sysctl(mib, mib_len, buf, &len, NULL, 0);
>> -  assert(!rv);
>> -
>> -  printf("sysctlnametomib: '%s' size: '%zu'\n", buf, len);
>> -}
>> -
>> -void test_asysctl() {
>> -  int mib[] = {CTL_KERN, KERN_OSTYPE};
>> -  size_t len;
>> -  char *buf = (char *)asysctl(mib, __arraycount(mib), &len);
>> -  assert(buf);
>> -
>> -  printf("asysctl: '%s' size: '%zu'\n", buf, len);
>> -
>> -  free(buf);
>> -}
>> -
>> -void test_asysctlbyname() {
>> -  size_t len;
>> -  char *buf = (char *)asysctlbyname("kern.ostype", &len);
>> -  assert(buf);
>> -
>> -  printf("asysctlbyname: '%s' size: '%zu'\n", buf, len);
>> -
>> -  free(buf);
>> -}
>> -
>> -int main(void) {
>> -  printf("sysctl\n");
>> -
>> -  test_sysctl();
>> -  test_sysctlbyname();
>> -  test_sysctlgetmibinfo();
>> -  test_sysctlnametomib();
>> -  test_asysctl();
>> -  test_asysctlbyname();
>> -
>> -  // CHECK: sysctl
>> -  // CHECK: sysctl: '{{.*}}' size: '{{.*}}'
>> -  // CHECK: sysctlbyname: '{{.*}}' size: '{{.*}}'
>> -  // CHECK: sysctlgetmibinfo: '{{.*}}' size: '{{.*}}'
>> -  // CHECK: sysctlnametomib: '{{.*}}' size: '{{.*}}'
>> -  // CHECK: asysctl: '{{.*}}' size: '{{.*}}'
>> -  // CHECK: asysctlbyname: '{{.*}}' size: '{{.*}}'
>> -
>> -  return 0;
>> -}
>>
>> Copied: compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/sysctl.cc
>> (from r348292,
>> compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc)
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/sysctl.cc?p2=compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/sysctl.cc&p1=compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc&r1=348292&r2=348293&rev=348293&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/test/sanitizer_common/TestCases/NetBSD/sysctl.cc
>> (original)
>> +++ compiler-rt/trunk/test/sanitizer_common/TestCases/Posix/sysctl.cc Tue
>> Dec  4 11:00:38 2018
>> @@ -1,4 +1,6 @@
>>  // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
>> +//
>> +// UNSUPPORTED: linux darwin solaris
>>
>>  #include <sys/param.h>
>>  #include <sys/types.h>
>> @@ -9,6 +11,10 @@
>>  #include <stdio.h>
>>  #include <stdlib.h>
>>
>> +#ifndef __arraycount
>> +#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
>> +#endif
>> +
>>  void test_sysctl() {
>>    char buf[100];
>>    size_t len = sizeof(buf);
>> @@ -22,28 +28,12 @@ void test_sysctl() {
>>  void test_sysctlbyname() {
>>    char buf[100];
>>    size_t len = sizeof(buf);
>> -  int mib[] = {CTL_KERN, KERN_OSTYPE};
>>    int rv = sysctlbyname("kern.ostype", buf, &len, NULL, 0);
>>    assert(!rv);
>>
>>    printf("sysctlbyname: '%s' size: '%zu'\n", buf, len);
>>  }
>>
>> -void test_sysctlgetmibinfo() {
>> -  int mib[CTL_MAXNAME];
>> -  unsigned int mib_len = __arraycount(mib);
>> -  int rv = sysctlgetmibinfo("kern.ostype", &mib[0], &mib_len, NULL,
>> NULL, NULL,
>> -                       SYSCTL_VERSION);
>> -  assert(!rv);
>> -
>> -  char buf[100];
>> -  size_t len = sizeof(buf);
>> -  rv = sysctl(mib, mib_len, buf, &len, NULL, 0);
>> -  assert(!rv);
>> -
>> -  printf("sysctlgetmibinfo: '%s' size: '%zu'\n", buf, len);
>> -}
>> -
>>  void test_sysctlnametomib() {
>>    int mib[CTL_MAXNAME];
>>    size_t mib_len = __arraycount(mib);
>> @@ -58,6 +48,7 @@ void test_sysctlnametomib() {
>>    printf("sysctlnametomib: '%s' size: '%zu'\n", buf, len);
>>  }
>>
>> +#if defined(__NetBSD__)
>>  void test_asysctl() {
>>    int mib[] = {CTL_KERN, KERN_OSTYPE};
>>    size_t len;
>> @@ -79,23 +70,43 @@ void test_asysctlbyname() {
>>    free(buf);
>>  }
>>
>> +void test_sysctlgetmibinfo() {
>> +  int mib[CTL_MAXNAME];
>> +  unsigned int mib_len = __arraycount(mib);
>> +  int rv = sysctlgetmibinfo("kern.ostype", &mib[0], &mib_len, NULL,
>> NULL, NULL,
>> +                       SYSCTL_VERSION);
>> +  assert(!rv);
>> +
>> +  char buf[100];
>> +  size_t len = sizeof(buf);
>> +  rv = sysctl(mib, mib_len, buf, &len, NULL, 0);
>> +  assert(!rv);
>> +
>> +  printf("sysctlgetmibinfo: '%s' size: '%zu'\n", buf, len);
>> +}
>> +#endif
>> +
>>  int main(void) {
>>    printf("sysctl\n");
>>
>>    test_sysctl();
>>    test_sysctlbyname();
>> -  test_sysctlgetmibinfo();
>>    test_sysctlnametomib();
>> +#if defined(__NetBSD__)
>>    test_asysctl();
>>    test_asysctlbyname();
>> +  test_sysctlgetmibinfo();
>> +#endif
>>
>>    // CHECK: sysctl
>>    // CHECK: sysctl: '{{.*}}' size: '{{.*}}'
>>    // CHECK: sysctlbyname: '{{.*}}' size: '{{.*}}'
>> -  // CHECK: sysctlgetmibinfo: '{{.*}}' size: '{{.*}}'
>>    // CHECK: sysctlnametomib: '{{.*}}' size: '{{.*}}'
>> +#if defined(__NetBSD__)
>>    // CHECK: asysctl: '{{.*}}' size: '{{.*}}'
>>    // CHECK: asysctlbyname: '{{.*}}' size: '{{.*}}'
>> +  // CHECK: sysctlgetmibinfo: '{{.*}}' size: '{{.*}}'
>> +#endif
>>
>>    return 0;
>>  }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181204/690fbd32/attachment.html>


More information about the llvm-commits mailing list