Skip to content

Commit 70087d2

Browse files
committed
Merge tag 'trace-v6.16-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull tracing fixes from Steven Rostedt: - Fix UAF in module unload in ftrace when there's a bug in the module If a module is buggy and triggers ftrace_disable which is set when an anomaly is detected, when it gets unloaded it doesn't free the hooks into kallsyms, and when a kallsyms lookup is performed it may access the mod->modname field and crash via UAF. Fix this by still freeing the mod_maps that are attached to kallsyms on module unload regardless if ftrace_disable is set or not. - Do not bother allocating mod_maps for kallsyms if ftrace_disable is set - Remove unused trace events When a trace event or tracepoint is created but not used, it still creates the code and data structures needed for that trace event. This just wastes memory. Remove the trace events that are created but not used. This does not remove trace events that are created but are not used due configs not being set. That will be handled later. This only removes events that have no user under any config. * tag 'trace-v6.16-2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace: fsdax: Remove unused trace events for dax insert mapping genirq/matrix: Remove unused irq_matrix_alloc_reserved tracepoint xdp: Remove unused mem_return_failed event ftrace: Don't allocate ftrace module map if ftrace is disabled ftrace: Fix UAF when lookup kallsym after ftrace disabled
2 parents def5b09 + a4a45a9 commit 70087d2

File tree

4 files changed

+10
-115
lines changed

4 files changed

+10
-115
lines changed

include/trace/events/fs_dax.h

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -102,54 +102,6 @@ DEFINE_EVENT(dax_pmd_load_hole_class, name, \
102102
DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole);
103103
DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback);
104104

105-
DECLARE_EVENT_CLASS(dax_pmd_insert_mapping_class,
106-
TP_PROTO(struct inode *inode, struct vm_fault *vmf,
107-
long length, pfn_t pfn, void *radix_entry),
108-
TP_ARGS(inode, vmf, length, pfn, radix_entry),
109-
TP_STRUCT__entry(
110-
__field(unsigned long, ino)
111-
__field(unsigned long, vm_flags)
112-
__field(unsigned long, address)
113-
__field(long, length)
114-
__field(u64, pfn_val)
115-
__field(void *, radix_entry)
116-
__field(dev_t, dev)
117-
__field(int, write)
118-
),
119-
TP_fast_assign(
120-
__entry->dev = inode->i_sb->s_dev;
121-
__entry->ino = inode->i_ino;
122-
__entry->vm_flags = vmf->vma->vm_flags;
123-
__entry->address = vmf->address;
124-
__entry->write = vmf->flags & FAULT_FLAG_WRITE;
125-
__entry->length = length;
126-
__entry->pfn_val = pfn.val;
127-
__entry->radix_entry = radix_entry;
128-
),
129-
TP_printk("dev %d:%d ino %#lx %s %s address %#lx length %#lx "
130-
"pfn %#llx %s radix_entry %#lx",
131-
MAJOR(__entry->dev),
132-
MINOR(__entry->dev),
133-
__entry->ino,
134-
__entry->vm_flags & VM_SHARED ? "shared" : "private",
135-
__entry->write ? "write" : "read",
136-
__entry->address,
137-
__entry->length,
138-
__entry->pfn_val & ~PFN_FLAGS_MASK,
139-
__print_flags_u64(__entry->pfn_val & PFN_FLAGS_MASK, "|",
140-
PFN_FLAGS_TRACE),
141-
(unsigned long)__entry->radix_entry
142-
)
143-
)
144-
145-
#define DEFINE_PMD_INSERT_MAPPING_EVENT(name) \
146-
DEFINE_EVENT(dax_pmd_insert_mapping_class, name, \
147-
TP_PROTO(struct inode *inode, struct vm_fault *vmf, \
148-
long length, pfn_t pfn, void *radix_entry), \
149-
TP_ARGS(inode, vmf, length, pfn, radix_entry))
150-
151-
DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping);
152-
153105
DECLARE_EVENT_CLASS(dax_pte_fault_class,
154106
TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result),
155107
TP_ARGS(inode, vmf, result),
@@ -194,36 +146,6 @@ DEFINE_PTE_FAULT_EVENT(dax_load_hole);
194146
DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite_no_entry);
195147
DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite);
196148

197-
TRACE_EVENT(dax_insert_mapping,
198-
TP_PROTO(struct inode *inode, struct vm_fault *vmf, void *radix_entry),
199-
TP_ARGS(inode, vmf, radix_entry),
200-
TP_STRUCT__entry(
201-
__field(unsigned long, ino)
202-
__field(unsigned long, vm_flags)
203-
__field(unsigned long, address)
204-
__field(void *, radix_entry)
205-
__field(dev_t, dev)
206-
__field(int, write)
207-
),
208-
TP_fast_assign(
209-
__entry->dev = inode->i_sb->s_dev;
210-
__entry->ino = inode->i_ino;
211-
__entry->vm_flags = vmf->vma->vm_flags;
212-
__entry->address = vmf->address;
213-
__entry->write = vmf->flags & FAULT_FLAG_WRITE;
214-
__entry->radix_entry = radix_entry;
215-
),
216-
TP_printk("dev %d:%d ino %#lx %s %s address %#lx radix_entry %#lx",
217-
MAJOR(__entry->dev),
218-
MINOR(__entry->dev),
219-
__entry->ino,
220-
__entry->vm_flags & VM_SHARED ? "shared" : "private",
221-
__entry->write ? "write" : "read",
222-
__entry->address,
223-
(unsigned long)__entry->radix_entry
224-
)
225-
)
226-
227149
DECLARE_EVENT_CLASS(dax_writeback_range_class,
228150
TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index),
229151
TP_ARGS(inode, start_index, end_index),

include/trace/events/irq_matrix.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,6 @@ DEFINE_EVENT(irq_matrix_global_update, irq_matrix_assign_system,
138138
TP_ARGS(bit, matrix)
139139
);
140140

141-
DEFINE_EVENT(irq_matrix_cpu, irq_matrix_alloc_reserved,
142-
143-
TP_PROTO(int bit, unsigned int cpu,
144-
struct irq_matrix *matrix, struct cpumap *cmap),
145-
146-
TP_ARGS(bit, cpu, matrix, cmap)
147-
);
148-
149141
DEFINE_EVENT(irq_matrix_cpu, irq_matrix_reserve_managed,
150142

151143
TP_PROTO(int bit, unsigned int cpu,

include/trace/events/xdp.h

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -379,32 +379,6 @@ TRACE_EVENT(mem_connect,
379379
)
380380
);
381381

382-
TRACE_EVENT(mem_return_failed,
383-
384-
TP_PROTO(const struct xdp_mem_info *mem,
385-
const struct page *page),
386-
387-
TP_ARGS(mem, page),
388-
389-
TP_STRUCT__entry(
390-
__field(const struct page *, page)
391-
__field(u32, mem_id)
392-
__field(u32, mem_type)
393-
),
394-
395-
TP_fast_assign(
396-
__entry->page = page;
397-
__entry->mem_id = mem->id;
398-
__entry->mem_type = mem->type;
399-
),
400-
401-
TP_printk("mem_id=%d mem_type=%s page=%p",
402-
__entry->mem_id,
403-
__print_symbolic(__entry->mem_type, __MEM_TYPE_SYM_TAB),
404-
__entry->page
405-
)
406-
);
407-
408382
TRACE_EVENT(bpf_xdp_link_attach_failed,
409383

410384
TP_PROTO(const char *msg),

kernel/trace/ftrace.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7438,9 +7438,10 @@ void ftrace_release_mod(struct module *mod)
74387438

74397439
mutex_lock(&ftrace_lock);
74407440

7441-
if (ftrace_disabled)
7442-
goto out_unlock;
7443-
7441+
/*
7442+
* To avoid the UAF problem after the module is unloaded, the
7443+
* 'mod_map' resource needs to be released unconditionally.
7444+
*/
74447445
list_for_each_entry_safe(mod_map, n, &ftrace_mod_maps, list) {
74457446
if (mod_map->mod == mod) {
74467447
list_del_rcu(&mod_map->list);
@@ -7449,6 +7450,9 @@ void ftrace_release_mod(struct module *mod)
74497450
}
74507451
}
74517452

7453+
if (ftrace_disabled)
7454+
goto out_unlock;
7455+
74527456
/*
74537457
* Each module has its own ftrace_pages, remove
74547458
* them from the list.
@@ -7627,6 +7631,9 @@ allocate_ftrace_mod_map(struct module *mod,
76277631
{
76287632
struct ftrace_mod_map *mod_map;
76297633

7634+
if (ftrace_disabled)
7635+
return NULL;
7636+
76307637
mod_map = kmalloc(sizeof(*mod_map), GFP_KERNEL);
76317638
if (!mod_map)
76327639
return NULL;

0 commit comments

Comments
 (0)