Skip to content

Commit 0e346e6

Browse files
aviraxpYlarod
andauthored
Switch kretprobe to heap (#2880)
Co-authored-by: Ylarod <[email protected]>
1 parent 2762487 commit 0e346e6

File tree

1 file changed

+44
-36
lines changed

1 file changed

+44
-36
lines changed

kernel/sucompat.c

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,42 @@ static struct kprobe *pts_kp = NULL;
335335

336336
#ifdef CONFIG_KRETPROBES
337337

338+
static struct kretprobe *init_kretprobe(const char *name,
339+
kretprobe_handler_t handler)
340+
{
341+
struct kretprobe *rp = kzalloc(sizeof(struct kretprobe), GFP_KERNEL);
342+
if (!rp)
343+
return NULL;
344+
rp->kp.symbol_name = name;
345+
rp->handler = handler;
346+
rp->data_size = 0;
347+
rp->maxactive = 0;
348+
349+
int ret = register_kretprobe(rp);
350+
pr_info("sucompat: register_%s kretprobe: %d\n", name, ret);
351+
if (ret) {
352+
kfree(rp);
353+
return NULL;
354+
}
355+
356+
return rp;
357+
}
358+
359+
static void destroy_kretprobe(struct kretprobe **rp_ptr)
360+
{
361+
struct kretprobe *rp = *rp_ptr;
362+
if (!rp)
363+
return;
364+
unregister_kretprobe(rp);
365+
synchronize_rcu();
366+
kfree(rp);
367+
*rp_ptr = NULL;
368+
}
369+
370+
#endif
371+
372+
#ifdef CONFIG_KRETPROBES
373+
338374
static int tracepoint_reg_count = 0;
339375
static DEFINE_SPINLOCK(tracepoint_reg_lock);
340376

@@ -372,21 +408,8 @@ static int syscall_unregfunc_handler(struct kretprobe_instance *ri, struct pt_re
372408
return 0;
373409
}
374410

375-
struct kretprobe syscall_regfunc_rp = {
376-
.kp.symbol_name = "syscall_regfunc",
377-
.handler = syscall_regfunc_handler,
378-
.entry_handler = NULL,
379-
.data_size = 0,
380-
.maxactive = 0,
381-
};
382-
383-
struct kretprobe syscall_unregfunc_rp = {
384-
.kp.symbol_name = "syscall_unregfunc",
385-
.handler = syscall_unregfunc_handler,
386-
.entry_handler = NULL,
387-
.data_size = 0,
388-
.maxactive = 0,
389-
};
411+
static struct kretprobe *syscall_regfunc_rp = NULL;
412+
static struct kretprobe *syscall_unregfunc_rp = NULL;
390413
#endif
391414

392415
void ksu_sucompat_enable()
@@ -399,22 +422,13 @@ void ksu_sucompat_enable()
399422
#endif
400423

401424
#ifdef CONFIG_KRETPROBES
402-
ret = register_kretprobe(&syscall_regfunc_rp);
403-
if (ret) {
404-
pr_err("sucompat: failed to register syscall_regfunc kretprobe: %d\n", ret);
405-
} else {
406-
pr_info("sucompat: syscall_regfunc kretprobe registered\n");
407-
}
408-
ret = register_kretprobe(&syscall_unregfunc_rp);
409-
if (ret) {
410-
pr_err("sucompat: failed to register syscall_unregfunc kretprobe: %d\n", ret);
411-
} else {
412-
pr_info("sucompat: syscall_unregfunc kretprobe registered\n");
413-
}
425+
// Register kretprobe for syscall_regfunc
426+
syscall_regfunc_rp = init_kretprobe("syscall_regfunc", syscall_regfunc_handler);
427+
// Register kretprobe for syscall_unregfunc
428+
syscall_unregfunc_rp = init_kretprobe("syscall_unregfunc", syscall_unregfunc_handler);
414429
#endif
415430

416431
#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
417-
// Register sys_enter tracepoint for syscall interception
418432
ret = register_trace_sys_enter(sucompat_sys_enter_handler, NULL);
419433
#ifndef CONFIG_KRETPROBES
420434
unmark_all_process();
@@ -432,23 +446,17 @@ void ksu_sucompat_disable()
432446
{
433447
pr_info("sucompat: ksu_sucompat_disable called\n");
434448
#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
435-
// Unregister sys_enter tracepoint
436449
unregister_trace_sys_enter(sucompat_sys_enter_handler, NULL);
437450
tracepoint_synchronize_unregister();
438451
pr_info("sucompat: sys_enter tracepoint unregistered\n");
439452
#endif
440453

441454
#ifdef CONFIG_KRETPROBES
442-
// Unregister syscall_regfunc kretprobe
443-
unregister_kretprobe(&syscall_regfunc_rp);
444-
pr_info("sucompat: syscall_regfunc kretprobe unregistered\n");
445-
// Unregister syscall_unregfunc kretprobe
446-
unregister_kretprobe(&syscall_unregfunc_rp);
447-
pr_info("sucompat: syscall_unregfunc kretprobe unregistered\n");
455+
destroy_kretprobe(&syscall_regfunc_rp);
456+
destroy_kretprobe(&syscall_unregfunc_rp);
448457
#endif
449458

450459
#ifdef CONFIG_KPROBES
451-
// Unregister pts_unix98_lookup kprobe
452460
destroy_kprobe(&pts_kp);
453461
#endif
454462
}

0 commit comments

Comments
 (0)