[compiler-rt] acaca56 - [HWASan] Test longjmp(jmpbuf, 0).

Matt Morehouse via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 15 12:12:44 PDT 2021


Author: Matt Morehouse
Date: 2021-09-15T12:11:59-07:00
New Revision: acaca56471a7c7b68591f1bc0214177c43fa05d6

URL: https://github.com/llvm/llvm-project/commit/acaca56471a7c7b68591f1bc0214177c43fa05d6
DIFF: https://github.com/llvm/llvm-project/commit/acaca56471a7c7b68591f1bc0214177c43fa05d6.diff

LOG: [HWASan] Test longjmp(jmpbuf, 0).

Our interceptor needs to change retval to 1 when 0 is passed.

Reviewed By: eugenis

Differential Revision: https://reviews.llvm.org/D109788

Added: 
    

Modified: 
    compiler-rt/test/hwasan/TestCases/longjmp-setjmp-interception.c

Removed: 
    


################################################################################
diff  --git a/compiler-rt/test/hwasan/TestCases/longjmp-setjmp-interception.c b/compiler-rt/test/hwasan/TestCases/longjmp-setjmp-interception.c
index 68c1aaca0c61d..19e8cebb6634c 100644
--- a/compiler-rt/test/hwasan/TestCases/longjmp-setjmp-interception.c
+++ b/compiler-rt/test/hwasan/TestCases/longjmp-setjmp-interception.c
@@ -1,9 +1,13 @@
-// RUN: %clang_hwasan -g %s -o %t && not %run %t 2>&1 | FileCheck %s
+// RUN: %clang_hwasan -g %s -o %t
+// RUN: not %run %t 0 2>&1 | FileCheck %s
+// RUN: not %run %t -33 2>&1 | FileCheck %s
 // Only implemented for interceptor ABI on AArch64.
 // REQUIRES: aarch64-target-arch
 
+#include <assert.h>
 #include <setjmp.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 /* Testing longjmp/setjmp should test that accesses to scopes jmp'd over are
    caught.  */
@@ -11,10 +15,7 @@ int __attribute__((noinline))
 uses_longjmp(int **other_array, int num, jmp_buf env) {
   int internal_array[100] = {0};
   *other_array = &internal_array[0];
-  if (num % 2)
-    longjmp(env, num);
-  else
-    return num % 8;
+  longjmp(env, num);
 }
 
 int __attribute__((noinline)) uses_setjmp(int num) {
@@ -23,6 +24,7 @@ int __attribute__((noinline)) uses_setjmp(int num) {
   sigjmp_buf cur_env;
   int temp = 0;
   if ((temp = sigsetjmp(cur_env, 1)) != 0) {
+    assert((num == 0 && temp == 1) || (num != 0 && temp == num));
     // We're testing that our longjmp interceptor untagged the previous stack.
     // Hence the tag in memory should be zero.
     if (other_array != NULL)
@@ -33,7 +35,9 @@ int __attribute__((noinline)) uses_setjmp(int num) {
     return uses_longjmp(&other_array, num, cur_env);
 }
 
-int __attribute__((noinline)) main() {
-  uses_setjmp(1);
+int __attribute__((noinline)) main(int argc, char *argv[]) {
+  assert(argc == 2);
+  int longjmp_retval = atoi(argv[1]);
+  uses_setjmp(longjmp_retval);
   return 0;
 }


        


More information about the llvm-commits mailing list