Merge remote-tracking branch 'torvalds/master' into perf/urgent
[linux-2.6-microblaze.git] / lib / test_kasan.c
index dc05cfc..cacbbbd 100644 (file)
@@ -654,8 +654,20 @@ static char global_array[10];
 
 static void kasan_global_oob(struct kunit *test)
 {
-       volatile int i = 3;
-       char *p = &global_array[ARRAY_SIZE(global_array) + i];
+       /*
+        * Deliberate out-of-bounds access. To prevent CONFIG_UBSAN_LOCAL_BOUNDS
+        * from failing here and panicing the kernel, access the array via a
+        * volatile pointer, which will prevent the compiler from being able to
+        * determine the array bounds.
+        *
+        * This access uses a volatile pointer to char (char *volatile) rather
+        * than the more conventional pointer to volatile char (volatile char *)
+        * because we want to prevent the compiler from making inferences about
+        * the pointer itself (i.e. its array bounds), not the data that it
+        * refers to.
+        */
+       char *volatile array = global_array;
+       char *p = &array[ARRAY_SIZE(global_array) + 3];
 
        /* Only generic mode instruments globals. */
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
@@ -703,8 +715,9 @@ static void ksize_uaf(struct kunit *test)
 static void kasan_stack_oob(struct kunit *test)
 {
        char stack_array[10];
-       volatile int i = OOB_TAG_OFF;
-       char *p = &stack_array[ARRAY_SIZE(stack_array) + i];
+       /* See comment in kasan_global_oob. */
+       char *volatile array = stack_array;
+       char *p = &array[ARRAY_SIZE(stack_array) + OOB_TAG_OFF];
 
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_STACK);
 
@@ -715,7 +728,9 @@ static void kasan_alloca_oob_left(struct kunit *test)
 {
        volatile int i = 10;
        char alloca_array[i];
-       char *p = alloca_array - 1;
+       /* See comment in kasan_global_oob. */
+       char *volatile array = alloca_array;
+       char *p = array - 1;
 
        /* Only generic mode instruments dynamic allocas. */
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
@@ -728,7 +743,9 @@ static void kasan_alloca_oob_right(struct kunit *test)
 {
        volatile int i = 10;
        char alloca_array[i];
-       char *p = alloca_array + i;
+       /* See comment in kasan_global_oob. */
+       char *volatile array = alloca_array;
+       char *p = array + i;
 
        /* Only generic mode instruments dynamic allocas. */
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);