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>
#include <lttng-tracepoint.h>
#include <wrapper/list.h>
#include <lttng-tracepoint.h>
#include <wrapper/list.h>
+#include <wrapper/tracepoint.h>
/*
* Protect the tracepoint table. lttng_tracepoint_mutex nests within
/*
* Protect the tracepoint table. lttng_tracepoint_mutex nests within
struct tracepoint_entry *e;
struct lttng_tp_probe *p;
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);
e = get_tracepoint(tp->name);
if (!e) {
e = add_tracepoint(tp->name);
struct tracepoint_entry *e;
struct lttng_tp_probe *p;
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;
e = get_tracepoint(tp->name);
if (!e || !e->tp)
continue;
#endif /*#else #if defined(CONFIG_MODULE_SIG) && defined(MODULE) */
#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 */
#endif /* _LTTNG_WRAPPER_TRACEPOINT_H */