@@ -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+
338374static int tracepoint_reg_count = 0 ;
339375static 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
392415void 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