Fix: adapt to kernel relative references
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 12 Oct 2018 18:47:53 +0000 (14:47 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 18 Oct 2018 14:31:31 +0000 (10:31 -0400)
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 <mathieu.desnoyers@efficios.com>
lttng-tracepoint.c
wrapper/tracepoint.h

index 7a50dd281632e7e5df45afb6379ee600bcc7e72e..4cfec38502f54fe74de19c13ad8e8b8a1694d6f6 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <lttng-tracepoint.h>
 #include <wrapper/list.h>
+#include <wrapper/tracepoint.h>
 
 /*
  * Protect the tracepoint table. lttng_tracepoint_mutex nests within
@@ -241,7 +242,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);
@@ -282,7 +283,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;
index 780f9a86607adf55848a72f4b5c2c7fef3d2e9c4..a860cb82a888d24d10d9d2f9621e6d6a20c7f911 100644 (file)
@@ -120,4 +120,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 */
This page took 0.027456 seconds and 4 git commands to generate.