Skip to content

Commit c6c67bf

Browse files
committed
Merge tag 'trace-probes-v6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull tracing/probes fixes from Steven Rostedt: - Fix possible NULL pointer dereference on trace_event_file in kprobe_event_gen_test_exit() - Fix NULL pointer dereference for trace_array in kprobe_event_gen_test_exit() - Fix memory leak of filter string for eprobes - Fix a possible memory leak in rethook_alloc() - Skip clearing aggrprobe's post_handler in kprobe-on-ftrace case which can cause a possible use-after-free - Fix warning in eprobe filter creation - Fix eprobe filter creation as it picked the wrong event for the fields * tag 'trace-probes-v6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace: tracing/eprobe: Fix eprobe filter to make a filter correctly tracing/eprobe: Fix warning in filter creation kprobes: Skip clearing aggrprobe's post_handler in kprobe-on-ftrace case rethook: fix a potential memleak in rethook_alloc() tracing/eprobe: Fix memory leak of filter string tracing: kprobe: Fix potential null-ptr-deref on trace_array in kprobe_event_gen_test_exit() tracing: kprobe: Fix potential null-ptr-deref on trace_event_file in kprobe_event_gen_test_exit()
2 parents 5239dde + 40adaf5 commit c6c67bf

File tree

4 files changed

+45
-20
lines changed

4 files changed

+45
-20
lines changed

kernel/kprobes.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1766,7 +1766,13 @@ static int __unregister_kprobe_top(struct kprobe *p)
17661766
if ((list_p != p) && (list_p->post_handler))
17671767
goto noclean;
17681768
}
1769-
ap->post_handler = NULL;
1769+
/*
1770+
* For the kprobe-on-ftrace case, we keep the
1771+
* post_handler setting to identify this aggrprobe
1772+
* armed with kprobe_ipmodify_ops.
1773+
*/
1774+
if (!kprobe_ftrace(ap))
1775+
ap->post_handler = NULL;
17701776
}
17711777
noclean:
17721778
/*

kernel/trace/kprobe_event_gen_test.c

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ static struct trace_event_file *gen_kretprobe_test;
7373
#define KPROBE_GEN_TEST_ARG3 NULL
7474
#endif
7575

76+
static bool trace_event_file_is_valid(struct trace_event_file *input)
77+
{
78+
return input && !IS_ERR(input);
79+
}
7680

7781
/*
7882
* Test to make sure we can create a kprobe event, then add more
@@ -139,6 +143,8 @@ static int __init test_gen_kprobe_cmd(void)
139143
kfree(buf);
140144
return ret;
141145
delete:
146+
if (trace_event_file_is_valid(gen_kprobe_test))
147+
gen_kprobe_test = NULL;
142148
/* We got an error after creating the event, delete it */
143149
ret = kprobe_event_delete("gen_kprobe_test");
144150
goto out;
@@ -202,6 +208,8 @@ static int __init test_gen_kretprobe_cmd(void)
202208
kfree(buf);
203209
return ret;
204210
delete:
211+
if (trace_event_file_is_valid(gen_kretprobe_test))
212+
gen_kretprobe_test = NULL;
205213
/* We got an error after creating the event, delete it */
206214
ret = kprobe_event_delete("gen_kretprobe_test");
207215
goto out;
@@ -217,10 +225,12 @@ static int __init kprobe_event_gen_test_init(void)
217225

218226
ret = test_gen_kretprobe_cmd();
219227
if (ret) {
220-
WARN_ON(trace_array_set_clr_event(gen_kretprobe_test->tr,
221-
"kprobes",
222-
"gen_kretprobe_test", false));
223-
trace_put_event_file(gen_kretprobe_test);
228+
if (trace_event_file_is_valid(gen_kretprobe_test)) {
229+
WARN_ON(trace_array_set_clr_event(gen_kretprobe_test->tr,
230+
"kprobes",
231+
"gen_kretprobe_test", false));
232+
trace_put_event_file(gen_kretprobe_test);
233+
}
224234
WARN_ON(kprobe_event_delete("gen_kretprobe_test"));
225235
}
226236

@@ -229,24 +239,30 @@ static int __init kprobe_event_gen_test_init(void)
229239

230240
static void __exit kprobe_event_gen_test_exit(void)
231241
{
232-
/* Disable the event or you can't remove it */
233-
WARN_ON(trace_array_set_clr_event(gen_kprobe_test->tr,
234-
"kprobes",
235-
"gen_kprobe_test", false));
242+
if (trace_event_file_is_valid(gen_kprobe_test)) {
243+
/* Disable the event or you can't remove it */
244+
WARN_ON(trace_array_set_clr_event(gen_kprobe_test->tr,
245+
"kprobes",
246+
"gen_kprobe_test", false));
247+
248+
/* Now give the file and instance back */
249+
trace_put_event_file(gen_kprobe_test);
250+
}
236251

237-
/* Now give the file and instance back */
238-
trace_put_event_file(gen_kprobe_test);
239252

240253
/* Now unregister and free the event */
241254
WARN_ON(kprobe_event_delete("gen_kprobe_test"));
242255

243-
/* Disable the event or you can't remove it */
244-
WARN_ON(trace_array_set_clr_event(gen_kretprobe_test->tr,
245-
"kprobes",
246-
"gen_kretprobe_test", false));
256+
if (trace_event_file_is_valid(gen_kretprobe_test)) {
257+
/* Disable the event or you can't remove it */
258+
WARN_ON(trace_array_set_clr_event(gen_kretprobe_test->tr,
259+
"kprobes",
260+
"gen_kretprobe_test", false));
261+
262+
/* Now give the file and instance back */
263+
trace_put_event_file(gen_kretprobe_test);
264+
}
247265

248-
/* Now give the file and instance back */
249-
trace_put_event_file(gen_kretprobe_test);
250266

251267
/* Now unregister and free the event */
252268
WARN_ON(kprobe_event_delete("gen_kretprobe_test"));

kernel/trace/rethook.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ struct rethook *rethook_alloc(void *data, rethook_handler_t handler)
8383
{
8484
struct rethook *rh = kzalloc(sizeof(struct rethook), GFP_KERNEL);
8585

86-
if (!rh || !handler)
86+
if (!rh || !handler) {
87+
kfree(rh);
8788
return NULL;
89+
}
8890

8991
rh->data = data;
9092
rh->handler = handler;

kernel/trace/trace_eprobe.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ static void trace_event_probe_cleanup(struct trace_eprobe *ep)
5252
kfree(ep->event_system);
5353
if (ep->event)
5454
trace_event_put_ref(ep->event);
55+
kfree(ep->filter_str);
5556
kfree(ep);
5657
}
5758

@@ -645,7 +646,7 @@ new_eprobe_trigger(struct trace_eprobe *ep, struct trace_event_file *file)
645646
INIT_LIST_HEAD(&trigger->list);
646647

647648
if (ep->filter_str) {
648-
ret = create_event_filter(file->tr, file->event_call,
649+
ret = create_event_filter(file->tr, ep->event,
649650
ep->filter_str, false, &filter);
650651
if (ret)
651652
goto error;
@@ -903,7 +904,7 @@ static int trace_eprobe_tp_update_arg(struct trace_eprobe *ep, const char *argv[
903904

904905
static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const char *argv[])
905906
{
906-
struct event_filter *dummy;
907+
struct event_filter *dummy = NULL;
907908
int i, ret, len = 0;
908909
char *p;
909910

0 commit comments

Comments
 (0)