kfence: add test suite
[platform/kernel/linux-starfive.git] / mm / kfence / report.c
index 4dbfa9a..901bd7e 100644 (file)
@@ -156,7 +156,12 @@ static void print_diff_canary(unsigned long address, size_t bytes_to_show,
        pr_cont(" ]");
 }
 
-void kfence_report_error(unsigned long address, struct pt_regs *regs,
+static const char *get_access_type(bool is_write)
+{
+       return is_write ? "write" : "read";
+}
+
+void kfence_report_error(unsigned long address, bool is_write, struct pt_regs *regs,
                         const struct kfence_metadata *meta, enum kfence_error_type type)
 {
        unsigned long stack_entries[KFENCE_STACK_DEPTH] = { 0 };
@@ -194,17 +199,19 @@ void kfence_report_error(unsigned long address, struct pt_regs *regs,
        case KFENCE_ERROR_OOB: {
                const bool left_of_object = address < meta->addr;
 
-               pr_err("BUG: KFENCE: out-of-bounds in %pS\n\n", (void *)stack_entries[skipnr]);
-               pr_err("Out-of-bounds access at 0x" PTR_FMT " (%luB %s of kfence-#%zd):\n",
-                      (void *)address,
+               pr_err("BUG: KFENCE: out-of-bounds %s in %pS\n\n", get_access_type(is_write),
+                      (void *)stack_entries[skipnr]);
+               pr_err("Out-of-bounds %s at 0x" PTR_FMT " (%luB %s of kfence-#%zd):\n",
+                      get_access_type(is_write), (void *)address,
                       left_of_object ? meta->addr - address : address - meta->addr,
                       left_of_object ? "left" : "right", object_index);
                break;
        }
        case KFENCE_ERROR_UAF:
-               pr_err("BUG: KFENCE: use-after-free in %pS\n\n", (void *)stack_entries[skipnr]);
-               pr_err("Use-after-free access at 0x" PTR_FMT " (in kfence-#%zd):\n",
-                      (void *)address, object_index);
+               pr_err("BUG: KFENCE: use-after-free %s in %pS\n\n", get_access_type(is_write),
+                      (void *)stack_entries[skipnr]);
+               pr_err("Use-after-free %s at 0x" PTR_FMT " (in kfence-#%zd):\n",
+                      get_access_type(is_write), (void *)address, object_index);
                break;
        case KFENCE_ERROR_CORRUPTION:
                pr_err("BUG: KFENCE: memory corruption in %pS\n\n", (void *)stack_entries[skipnr]);
@@ -213,8 +220,10 @@ void kfence_report_error(unsigned long address, struct pt_regs *regs,
                pr_cont(" (in kfence-#%zd):\n", object_index);
                break;
        case KFENCE_ERROR_INVALID:
-               pr_err("BUG: KFENCE: invalid access in %pS\n\n", (void *)stack_entries[skipnr]);
-               pr_err("Invalid access at 0x" PTR_FMT ":\n", (void *)address);
+               pr_err("BUG: KFENCE: invalid %s in %pS\n\n", get_access_type(is_write),
+                      (void *)stack_entries[skipnr]);
+               pr_err("Invalid %s at 0x" PTR_FMT ":\n", get_access_type(is_write),
+                      (void *)address);
                break;
        case KFENCE_ERROR_INVALID_FREE:
                pr_err("BUG: KFENCE: invalid free in %pS\n\n", (void *)stack_entries[skipnr]);