[compiler-rt] r243610 - [sanitizer] add a weak hook for strncmp interceptor, both to dfsan and other sanitizers. Hide the declaration and the calls in better macros

Alexey Samsonov vonosmas at gmail.com
Thu Jul 30 17:52:41 PDT 2015


On Wed, Jul 29, 2015 at 7:32 PM, Kostya Serebryany <kcc at google.com> wrote:

> Author: kcc
> Date: Wed Jul 29 21:32:51 2015
> New Revision: 243610
>
> URL: http://llvm.org/viewvc/llvm-project?rev=243610&view=rev
> Log:
> [sanitizer] add a weak hook for strncmp interceptor, both to dfsan and
> other sanitizers. Hide the declaration and the calls in better macros
>
> Modified:
>     compiler-rt/trunk/include/sanitizer/common_interface_defs.h
>     compiler-rt/trunk/include/sanitizer/dfsan_interface.h
>     compiler-rt/trunk/lib/dfsan/dfsan_custom.cc
>
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
>
> Modified: compiler-rt/trunk/include/sanitizer/common_interface_defs.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/common_interface_defs.h?rev=243610&r1=243609&r2=243610&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/include/sanitizer/common_interface_defs.h (original)
> +++ compiler-rt/trunk/include/sanitizer/common_interface_defs.h Wed Jul 29
> 21:32:51 2015
> @@ -120,6 +120,8 @@ extern "C" {
>    // FIXME: implement more hooks.
>    void __sanitizer_weak_hook_memcmp(void *called_pc, const void *s1,
>                                      const void *s2, size_t n);
> +  void __sanitizer_weak_hook_strncmp(void *called_pc, const char *s1,
> +                                    const char *s2, size_t n);
>  #ifdef __cplusplus
>  }  // extern "C"
>  #endif
>
> Modified: compiler-rt/trunk/include/sanitizer/dfsan_interface.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/dfsan_interface.h?rev=243610&r1=243609&r2=243610&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/include/sanitizer/dfsan_interface.h (original)
> +++ compiler-rt/trunk/include/sanitizer/dfsan_interface.h Wed Jul 29
> 21:32:51 2015
> @@ -91,16 +91,18 @@ void dfsan_set_write_callback(dfsan_writ
>  /// <label> <parent label 1> <parent label 2> <label description if any>
>  void dfsan_dump_labels(int fd);
>
> +/// Interceptor hooks.
>  /// Whenever a dfsan's custom function is called the corresponding
>  /// hook is called it non-zero. The hooks should be defined by the user.
>  /// The primary use case is taint-guided fuzzing, where the fuzzer
>  /// needs to see the parameters of the function and the labels.
>  /// FIXME: implement more hooks.
> -
> -/// memcmp hook.
>  void dfsan_weak_hook_memcmp(void *caller_pc, const void *s1, const void
> *s2,
>                              size_t n, dfsan_label s1_label,
>                              dfsan_label s2_label, dfsan_label n_label);
> +void dfsan_weak_hook_strncmp(void *caller_pc, const char *s1, const char
> *s2,
> +                             size_t n, dfsan_label s1_label,
> +                             dfsan_label s2_label, dfsan_label n_label);
>  #ifdef __cplusplus
>  }  // extern "C"
>
>
> Modified: compiler-rt/trunk/lib/dfsan/dfsan_custom.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/dfsan/dfsan_custom.cc?rev=243610&r1=243609&r2=243610&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/dfsan/dfsan_custom.cc (original)
> +++ compiler-rt/trunk/lib/dfsan/dfsan_custom.cc Wed Jul 29 21:32:51 2015
> @@ -43,6 +43,14 @@
>
>  using namespace __dfsan;
>
> +#define CALL_WEAK_INTERCEPTOR_HOOK(f, ...)
>      \
> +  do {
>      \
> +    if (f)
>      \
> +      f(__VA_ARGS__);
>       \
> +  } while (false)
> +#define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...) \
> +SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void
> f(__VA_ARGS__);
> +
>  extern "C" {
>  SANITIZER_INTERFACE_ATTRIBUTE int
>  __dfsw_stat(const char *path, struct stat *buf, dfsan_label path_label,
> @@ -82,20 +90,18 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__df
>    }
>  }
>
> -SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
> -void
> -dfsan_weak_hook_memcmp(uptr caller_pc, const void *s1, const void *s2,
> size_t n,
> -                       dfsan_label s1_label, dfsan_label s2_label,
> -                       dfsan_label n_label);
> +DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_memcmp, uptr caller_pc,
> +                              const void *s1, const void *s2, size_t n,
> +                              dfsan_label s1_label, dfsan_label s2_label,
> +                              dfsan_label n_label);
>
>  SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_memcmp(const void *s1, const
> void *s2,
>                                                  size_t n, dfsan_label
> s1_label,
>                                                  dfsan_label s2_label,
>                                                  dfsan_label n_label,
>                                                  dfsan_label *ret_label) {
> -  if (dfsan_weak_hook_memcmp)
> -    dfsan_weak_hook_memcmp(GET_CALLER_PC(), s1, s2, n, s1_label, s2_label,
> -                           n_label);
> +  CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_memcmp, GET_CALLER_PC(), s1,
> s2, n,
> +                             s1_label, s2_label, n_label);
>    const char *cs1 = (const char *) s1, *cs2 = (const char *) s2;
>    for (size_t i = 0; i != n; ++i) {
>      if (cs1[i] != cs2[i]) {
> @@ -153,6 +159,11 @@ __dfsw_strcasecmp(const char *s1, const
>    return 0;
>  }
>
> +DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strncmp, uptr caller_pc,
> +                              const char *s1, const char *s2, size_t n,
> +                              dfsan_label s1_label, dfsan_label s2_label,
> +                              dfsan_label n_label);
> +
>  SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strncmp(const char *s1, const
> char *s2,
>                                                   size_t n, dfsan_label
> s1_label,
>                                                   dfsan_label s2_label,
> @@ -163,6 +174,9 @@ SANITIZER_INTERFACE_ATTRIBUTE int __dfsw
>      return 0;
>    }
>
> +  CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strncmp, GET_CALLER_PC(),
> s1, s2,
> +                             n, s1_label, s2_label, n_label);
> +
>    for (size_t i = 0;; ++i) {
>      if (s1[i] != s2[i] || s1[i] == 0 || s2[i] == 0 || i == n - 1) {
>        if (flags().strict_data_dependencies) {
>
> 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=243610&r1=243609&r2=243610&view=diff
>
> ==============================================================================
> ---
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
> (original)
> +++
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
> Wed Jul 29 21:32:51 2015
> @@ -40,13 +40,19 @@
>  #include <stdarg.h>
>
>  #if SANITIZER_INTERCEPTOR_HOOKS
> -#define CALL_WEAK_INTERCEPTOR_HOOK4(f, ...)
>       \
> +#define CALL_WEAK_INTERCEPTOR_HOOK(f, ...)
>      \
>    do {
>      \
>      if (f)
>      \
>        f(__VA_ARGS__);
>       \
>    } while (false);
> +#define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...)
>       \
> +  extern "C" {
>      \
> +  SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void
> f(__VA_ARGS__);  \
> +  } // extern "C"
>  #else
> -#define CALL_WEAK_INTERCEPTOR_HOOK4(f, a1, a2, a3, a4)
> +#define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...)
> +#define CALL_WEAK_INTERCEPTOR_HOOK(f, a1, a2, a3, a4)
> +
>  #endif  // SANITIZER_INTERCEPTOR_HOOKS
>
>  #if SANITIZER_WINDOWS && !defined(va_copy)
> @@ -213,11 +219,16 @@ INTERCEPTOR(int, strcmp, const char *s1,
>    return CharCmpX(c1, c2);
>  }
>
> +DECLARE_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_strncmp, uptr
> called_pc,
> +                              const char *s1, const char *s2, uptr n);
>

^^
You don't need a semicolon after DECLARE_WEAK_INTERCEPTOR_HOOK (here and in
another places)
(found by -Wpedantic).



> +
>  INTERCEPTOR(int, strncmp, const char *s1, const char *s2, uptr size) {
>    if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)
>      return internal_strncmp(s1, s2, size);
>    void *ctx;
>    COMMON_INTERCEPTOR_ENTER(ctx, strncmp, s1, s2, size);
> +  CALL_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_strncmp,
> GET_CALLER_PC(), s1,
> +                             s2, size);
>    unsigned char c1 = 0, c2 = 0;
>    uptr i;
>    for (i = 0; i < size; i++) {
> @@ -374,19 +385,16 @@ INTERCEPTOR(char *, strpbrk, const char
>
>  #if SANITIZER_INTERCEPT_MEMCMP
>
> -extern "C" {
> -SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
> -void __sanitizer_weak_hook_memcmp(uptr called_pc, const void *s1,
> -                                  const void *s2, uptr n);
> -}  // extern "C"
> +DECLARE_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_memcmp, uptr
> called_pc,
> +                              const void *s1, const void *s2, uptr n);
>
>  INTERCEPTOR(int, memcmp, const void *a1, const void *a2, uptr size) {
>    void *ctx;
>    COMMON_INTERCEPTOR_ENTER(ctx, memcmp, a1, a2, size);
>    if (COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)
>      return internal_memcmp(a1, a2, size);
> -  CALL_WEAK_INTERCEPTOR_HOOK4(__sanitizer_weak_hook_memcmp,
> GET_CALLER_PC(), a1,
> -                              a2, size);
> +  CALL_WEAK_INTERCEPTOR_HOOK(__sanitizer_weak_hook_memcmp,
> GET_CALLER_PC(), a1,
> +                             a2, size);
>    if (common_flags()->intercept_memcmp) {
>      if (common_flags()->strict_memcmp) {
>        // Check the entire regions even if the first bytes of the buffers
> are
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150730/8747908b/attachment.html>


More information about the llvm-commits mailing list