@@ -191,7 +191,7 @@ int ksu_handle_devpts(struct inode *inode)
191191
192192#ifdef  CONFIG_KPROBES 
193193
194- static  int  sys_faccessat_handler_pre (struct  kprobe  * p , struct  pt_regs  * regs )
194+ static  int  faccessat_handler_pre (struct  kprobe  * p , struct  pt_regs  * regs )
195195{
196196	struct  pt_regs  * real_regs  =  PT_REAL_REGS (regs );
197197	int  * dfd  =  (int  * )& PT_REGS_PARM1 (real_regs );
@@ -202,17 +202,18 @@ static int sys_faccessat_handler_pre(struct kprobe *p, struct pt_regs *regs)
202202	return  ksu_handle_faccessat (dfd , filename_user , mode , NULL );
203203}
204204
205- static  int  sys_newfstatat_handler_pre (struct  kprobe  * p , struct  pt_regs  * regs )
205+ static  int  newfstatat_handler_pre (struct  kprobe  * p , struct  pt_regs  * regs )
206206{
207207	struct  pt_regs  * real_regs  =  PT_REAL_REGS (regs );
208208	int  * dfd  =  (int  * )& PT_REGS_PARM1 (real_regs );
209- 	const  char  __user  * * filename_user  =  (const  char  * * )& PT_REGS_PARM2 (real_regs );
209+ 	const  char  __user  * * filename_user  = 
210+ 		(const  char  * * )& PT_REGS_PARM2 (real_regs );
210211	int  * flags  =  (int  * )& PT_REGS_SYSCALL_PARM4 (real_regs );
211212
212213	return  ksu_handle_stat (dfd , filename_user , flags );
213214}
214215
215- static  int  sys_execve_handler_pre (struct  kprobe  * p , struct  pt_regs  * regs )
216+ static  int  execve_handler_pre (struct  kprobe  * p , struct  pt_regs  * regs )
216217{
217218	struct  pt_regs  * real_regs  =  PT_REAL_REGS (regs );
218219	const  char  __user  * * filename_user  = 
@@ -222,21 +223,6 @@ static int sys_execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
222223					  NULL );
223224}
224225
225- static  struct  kprobe  faccessat_kp  =  {
226- 	.symbol_name  =  SYS_FACCESSAT_SYMBOL ,
227- 	.pre_handler  =  sys_faccessat_handler_pre ,
228- };
229- 
230- static  struct  kprobe  newfstatat_kp  =  {
231- 	.symbol_name  =  SYS_NEWFSTATAT_SYMBOL ,
232- 	.pre_handler  =  sys_newfstatat_handler_pre ,
233- };
234- 
235- static  struct  kprobe  execve_kp  =  {
236- 	.symbol_name  =  SYS_EXECVE_SYMBOL ,
237- 	.pre_handler  =  sys_execve_handler_pre ,
238- };
239- 
240226static  int  pts_unix98_lookup_pre (struct  kprobe  * p , struct  pt_regs  * regs )
241227{
242228	struct  inode  * inode ;
@@ -246,35 +232,56 @@ static int pts_unix98_lookup_pre(struct kprobe *p, struct pt_regs *regs)
246232	return  ksu_handle_devpts (inode );
247233}
248234
249- static  struct  kprobe  pts_unix98_lookup_kp  =  { .symbol_name  = 
250- 						      "pts_unix98_lookup" ,
251- 					      .pre_handler  = 
252- 						      pts_unix98_lookup_pre  };
253- 
254235#endif 
255236
237+ static  struct  kprobe  * init_kprobe (const  char  * name ,
238+ 				  kprobe_pre_handler_t  handler )
239+ {
240+ 	struct  kprobe  * kp  =  kzalloc (sizeof (struct  kprobe ), GFP_KERNEL );
241+ 	if  (!kp )
242+ 		return  NULL ;
243+ 	kp -> symbol_name  =  name ;
244+ 	kp -> pre_handler  =  handler ;
245+ 
246+ 	int  ret  =  register_kprobe (kp );
247+ 	pr_info ("sucompat: register_%s kprobe: %d\n" , name , ret );
248+ 	if  (ret ) {
249+ 		kfree (kp );
250+ 		return  NULL ;
251+ 	}
252+ 
253+ 	return  kp ;
254+ }
255+ 
256+ static  void  destroy_kprobe (struct  kprobe  * * kp_ptr )
257+ {
258+ 	struct  kprobe  * kp  =  * kp_ptr ;
259+ 	if  (!kp )
260+ 		return ;
261+ 	unregister_kprobe (kp );
262+ 	synchronize_rcu ();
263+ 	kfree (kp );
264+ 	* kp_ptr  =  NULL ;
265+ }
266+ 
267+ static  struct  kprobe  * su_kps [4 ];
268+ 
256269// sucompat: permited process can execute 'su' to gain root access. 
257270void  ksu_sucompat_init ()
258271{
259272#ifdef  CONFIG_KPROBES 
260- 	int  ret ;
261- 	ret  =  register_kprobe (& execve_kp );
262- 	pr_info ("sucompat: execve_kp: %d\n" , ret );
263- 	ret  =  register_kprobe (& newfstatat_kp );
264- 	pr_info ("sucompat: newfstatat_kp: %d\n" , ret );
265- 	ret  =  register_kprobe (& faccessat_kp );
266- 	pr_info ("sucompat: faccessat_kp: %d\n" , ret );
267- 	ret  =  register_kprobe (& pts_unix98_lookup_kp );
268- 	pr_info ("sucompat: devpts_kp: %d\n" , ret );
273+ 	su_kps [0 ] =  init_kprobe (SYS_EXECVE_SYMBOL , execve_handler_pre );
274+ 	su_kps [1 ] =  init_kprobe (SYS_FACCESSAT_SYMBOL , faccessat_handler_pre );
275+ 	su_kps [2 ] =  init_kprobe (SYS_NEWFSTATAT_SYMBOL , newfstatat_handler_pre );
276+ 	su_kps [3 ] =  init_kprobe ("pts_unix98_lookup" , pts_unix98_lookup_pre );
269277#endif 
270278}
271279
272280void  ksu_sucompat_exit ()
273281{
274282#ifdef  CONFIG_KPROBES 
275- 	unregister_kprobe (& execve_kp );
276- 	unregister_kprobe (& newfstatat_kp );
277- 	unregister_kprobe (& faccessat_kp );
278- 	unregister_kprobe (& pts_unix98_lookup_kp );
283+ 	for  (int  i  =  0 ; i  <  ARRAY_SIZE (su_kps ); i ++ ) {
284+ 		destroy_kprobe (& su_kps [i ]);
285+ 	}
279286#endif 
280287}
0 commit comments