From c1b0a62512c0dad3c79f3eb29ed29d3a702f2274 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 12 Oct 2018 14:47:53 -0400 Subject: [PATCH] Fix: adapt to kernel relative references Upstream Linux commit 46e0c9be20 introduces relative references in the struct tracepoint array of pointers. Up to (including) v4.19-rc7, the upstream kernel has a type mismatch bug that allows it to pass an out-of-bound end of array to modules coming/going notifiers. The fix for upstream Linux is to introduce a new type: tracepoint_ptr_t, which can be used to adequately iterate on the array. It is introduced prior to v4.19 as commit 9c0be3f6b5d77 "tracepoint: Fix tracepoint array element size mismatch". Signed-off-by: Mathieu Desnoyers --- lttng-tracepoint.c | 5 +++-- wrapper/tracepoint.h | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lttng-tracepoint.c b/lttng-tracepoint.c index ec77e7cc..bbb2c7a4 100644 --- a/lttng-tracepoint.c +++ b/lttng-tracepoint.c @@ -17,6 +17,7 @@ #include #include +#include /* * Protect the tracepoint table. lttng_tracepoint_mutex nests within @@ -228,7 +229,7 @@ int lttng_tracepoint_coming(struct tp_module *tp_mod) struct tracepoint_entry *e; struct lttng_tp_probe *p; - tp = tp_mod->mod->tracepoints_ptrs[i]; + tp = lttng_tracepoint_ptr_deref(&tp_mod->mod->tracepoints_ptrs[i]); e = get_tracepoint(tp->name); if (!e) { e = add_tracepoint(tp->name); @@ -269,7 +270,7 @@ int lttng_tracepoint_going(struct tp_module *tp_mod) struct tracepoint_entry *e; struct lttng_tp_probe *p; - tp = tp_mod->mod->tracepoints_ptrs[i]; + tp = lttng_tracepoint_ptr_deref(&tp_mod->mod->tracepoints_ptrs[i]); e = get_tracepoint(tp->name); if (!e || !e->tp) continue; diff --git a/wrapper/tracepoint.h b/wrapper/tracepoint.h index 208a8ab3..23bc6e25 100644 --- a/wrapper/tracepoint.h +++ b/wrapper/tracepoint.h @@ -107,4 +107,16 @@ int wrapper_lttng_fixup_sig(struct module *mod) #endif /*#else #if defined(CONFIG_MODULE_SIG) && defined(MODULE) */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0)) +static inline struct tracepoint *lttng_tracepoint_ptr_deref(tracepoint_ptr_t *p) +{ + return tracepoint_ptr_deref(p); +} +#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0)) */ +static inline struct tracepoint *lttng_tracepoint_ptr_deref(struct tracepoint **p) +{ + return *p; +} +#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0)) */ + #endif /* _LTTNG_WRAPPER_TRACEPOINT_H */ -- 2.34.1