#include <asm/page.h>
 
+#include "../mm/kasan/kasan.h"
+
+#define OOB_TAG_OFF (IS_ENABLED(CONFIG_KASAN_GENERIC) ? 0 : KASAN_SHADOW_SCALE_SIZE)
+
 /*
  * We assign some test results to these globals to make sure the tests
  * are not eliminated as dead code.
                return;
        }
 
-       ptr[size] = 'x';
+       ptr[size + OOB_TAG_OFF] = 'x';
+
        kfree(ptr);
 }
 
                return;
        }
 
-       ptr[size] = 0;
+       ptr[size + OOB_TAG_OFF] = 0;
+
        kfree(ptr);
 }
 
                return;
        }
 
-       ptr2[size2] = 'x';
+       ptr2[size2 + OOB_TAG_OFF] = 'x';
+
        kfree(ptr2);
 }
 
                kfree(ptr1);
                return;
        }
-       ptr2[size2] = 'x';
+
+       ptr2[size2 + OOB_TAG_OFF] = 'x';
+
        kfree(ptr2);
 }
 
                return;
        }
 
-       memset(ptr+7, 0, 2);
+       memset(ptr + 7 + OOB_TAG_OFF, 0, 2);
+
        kfree(ptr);
 }
 
                return;
        }
 
-       memset(ptr+5, 0, 4);
+       memset(ptr + 5 + OOB_TAG_OFF, 0, 4);
+
        kfree(ptr);
 }
 
                return;
        }
 
-       memset(ptr+1, 0, 8);
+       memset(ptr + 1 + OOB_TAG_OFF, 0, 8);
+
        kfree(ptr);
 }
 
                return;
        }
 
-       memset(ptr+1, 0, 16);
+       memset(ptr + 1 + OOB_TAG_OFF, 0, 16);
+
        kfree(ptr);
 }
 
                return;
        }
 
-       memset(ptr, 0, size+5);
+       memset(ptr, 0, size + 5 + OOB_TAG_OFF);
+
        kfree(ptr);
 }
 
                return;
        }
 
-       *p = p[size];
+       *p = p[size + OOB_TAG_OFF];
+
        kmem_cache_free(cache, p);
        kmem_cache_destroy(cache);
 }
        }
 
        pr_info("out-of-bounds in copy_from_user()\n");
-       unused = copy_from_user(kmem, usermem, size + 1);
+       unused = copy_from_user(kmem, usermem, size + 1 + OOB_TAG_OFF);
 
        pr_info("out-of-bounds in copy_to_user()\n");
-       unused = copy_to_user(usermem, kmem, size + 1);
+       unused = copy_to_user(usermem, kmem, size + 1 + OOB_TAG_OFF);
 
        pr_info("out-of-bounds in __copy_from_user()\n");
-       unused = __copy_from_user(kmem, usermem, size + 1);
+       unused = __copy_from_user(kmem, usermem, size + 1 + OOB_TAG_OFF);
 
        pr_info("out-of-bounds in __copy_to_user()\n");
-       unused = __copy_to_user(usermem, kmem, size + 1);
+       unused = __copy_to_user(usermem, kmem, size + 1 + OOB_TAG_OFF);
 
        pr_info("out-of-bounds in __copy_from_user_inatomic()\n");
-       unused = __copy_from_user_inatomic(kmem, usermem, size + 1);
+       unused = __copy_from_user_inatomic(kmem, usermem, size + 1 + OOB_TAG_OFF);
 
        pr_info("out-of-bounds in __copy_to_user_inatomic()\n");
-       unused = __copy_to_user_inatomic(usermem, kmem, size + 1);
+       unused = __copy_to_user_inatomic(usermem, kmem, size + 1 + OOB_TAG_OFF);
 
        pr_info("out-of-bounds in strncpy_from_user()\n");
-       unused = strncpy_from_user(kmem, usermem, size + 1);
+       unused = strncpy_from_user(kmem, usermem, size + 1 + OOB_TAG_OFF);
 
        vm_munmap((unsigned long)usermem, PAGE_SIZE);
        kfree(kmem);