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

Vlad Tsyrklevich via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 4 13:17:57 PST 2018


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/5ddafa13/attachment.html>


More information about the llvm-commits mailing list