The KCOV-Dataflow write path (kcov_df_write) only checks
t->kcov_df_enabled before writing to the shared ring buffer. Unlike
the standard KCOV check_kcov_mode() which rejects interrupt context,
kcov_df_write() has no such protection. This means instrumented code
running in hardirq, softirq, or NMI context that interrupts a task
mid-write can re-enter kcov_df_write(), causing:

 - Data corruption in the ring buffer (interleaved records)
 - Out-of-order sequence counter increments
 - Potential faults from nested pointer dereferences

Add an in_task() check to reject calls from non-task context, matching
the safety model of the standard KCOV tracing path.

Also suppress -Wmissing-prototypes in the eight_args_c test module
Makefile, as the exported test functions intentionally lack a shared
header.

Signed-off-by: Yunseong Kim <[email protected]>
---
 kernel/kcov.c                             | 4 ++++
 tools/kcov-dataflow/eight_args_c/Makefile | 1 +
 2 files changed, 5 insertions(+)

diff --git a/kernel/kcov.c b/kernel/kcov.c
index d3c9c0efe961..373b8034ca5c 100644
--- a/kernel/kcov.c
+++ b/kernel/kcov.c
@@ -409,6 +409,10 @@ kcov_df_write(u64 type_marker, u64 pc, u64 meta, void *ptr,
        if (!t->kcov_df_enabled)
                return;
 
+       /* Reject calls from hardirq/softirq/NMI to prevent reentrant 
corruption. */
+       if (!in_task())
+               return;
+
        area = (u64 *)t->kcov_df_area;
        if (!area)
                return;
diff --git a/tools/kcov-dataflow/eight_args_c/Makefile 
b/tools/kcov-dataflow/eight_args_c/Makefile
index de35bb541f07..038775b49435 100644
--- a/tools/kcov-dataflow/eight_args_c/Makefile
+++ b/tools/kcov-dataflow/eight_args_c/Makefile
@@ -1,2 +1,3 @@
 obj-m := eight_args_mod.o
 KCOV_DATAFLOW_eight_args_mod.o := y
+ccflags-y += -Wno-missing-prototypes

-- 
2.43.0


Reply via email to