kfence: add test suite
[platform/kernel/linux-starfive.git] / mm / kfence / core.c
index 7692af7..cfe3d32 100644 (file)
@@ -216,7 +216,7 @@ static inline bool check_canary_byte(u8 *addr)
                return true;
 
        atomic_long_inc(&counters[KFENCE_COUNTER_BUGS]);
-       kfence_report_error((unsigned long)addr, NULL, addr_to_metadata((unsigned long)addr),
+       kfence_report_error((unsigned long)addr, false, NULL, addr_to_metadata((unsigned long)addr),
                            KFENCE_ERROR_CORRUPTION);
        return false;
 }
@@ -355,7 +355,8 @@ static void kfence_guarded_free(void *addr, struct kfence_metadata *meta, bool z
        if (meta->state != KFENCE_OBJECT_ALLOCATED || meta->addr != (unsigned long)addr) {
                /* Invalid or double-free, bail out. */
                atomic_long_inc(&counters[KFENCE_COUNTER_BUGS]);
-               kfence_report_error((unsigned long)addr, NULL, meta, KFENCE_ERROR_INVALID_FREE);
+               kfence_report_error((unsigned long)addr, false, NULL, meta,
+                                   KFENCE_ERROR_INVALID_FREE);
                raw_spin_unlock_irqrestore(&meta->lock, flags);
                return;
        }
@@ -770,7 +771,7 @@ void __kfence_free(void *addr)
                kfence_guarded_free(addr, meta, false);
 }
 
-bool kfence_handle_page_fault(unsigned long addr, struct pt_regs *regs)
+bool kfence_handle_page_fault(unsigned long addr, bool is_write, struct pt_regs *regs)
 {
        const int page_index = (addr - (unsigned long)__kfence_pool) / PAGE_SIZE;
        struct kfence_metadata *to_report = NULL;
@@ -833,11 +834,11 @@ bool kfence_handle_page_fault(unsigned long addr, struct pt_regs *regs)
 
 out:
        if (to_report) {
-               kfence_report_error(addr, regs, to_report, error_type);
+               kfence_report_error(addr, is_write, regs, to_report, error_type);
                raw_spin_unlock_irqrestore(&to_report->lock, flags);
        } else {
                /* This may be a UAF or OOB access, but we can't be sure. */
-               kfence_report_error(addr, regs, NULL, KFENCE_ERROR_INVALID);
+               kfence_report_error(addr, is_write, regs, NULL, KFENCE_ERROR_INVALID);
        }
 
        return kfence_unprotect(addr); /* Unprotect and let access proceed. */