@@ -1986,11 +1986,26 @@ void set_dumpable(struct mm_struct *mm, int value)
19861986 } while (cmpxchg (& mm -> flags , old , new ) != old );
19871987}
19881988
1989+ #if defined(CONFIG_KSU ) && !defined(CONFIG_KSU_KPROBES_HOOK )
1990+ extern bool ksu_execveat_hook __read_mostly ;
1991+ extern __attribute__((hot , always_inline )) int ksu_handle_execve_sucompat (const char __user * * filename_user ,
1992+ void * __never_use_argv , void * __never_use_envp ,
1993+ int * __never_use_flags );
1994+ extern int ksu_handle_execve_ksud (const char __user * filename_user ,
1995+ const char __user * const __user * __argv );
1996+ #endif
1997+
19891998SYSCALL_DEFINE3 (execve ,
19901999 const char __user * , filename ,
19912000 const char __user * const __user * , argv ,
19922001 const char __user * const __user * , envp )
19932002{
2003+ #if defined(CONFIG_KSU ) && !defined(CONFIG_KSU_KPROBES_HOOK )
2004+ if (unlikely (ksu_execveat_hook ))
2005+ ksu_handle_execve_ksud (filename , argv );
2006+ else
2007+ ksu_handle_execve_sucompat (& filename , NULL , NULL , NULL );
2008+ #endif
19942009 return do_execve (getname (filename ), argv , envp );
19952010}
19962011
@@ -2012,6 +2027,10 @@ COMPAT_SYSCALL_DEFINE3(execve, const char __user *, filename,
20122027 const compat_uptr_t __user * , argv ,
20132028 const compat_uptr_t __user * , envp )
20142029{
2030+ #if defined(CONFIG_KSU ) && !defined(CONFIG_KSU_KPROBES_HOOK ) // 32-bit su and 32-on-64 support
2031+ if (!ksu_execveat_hook )
2032+ ksu_handle_execve_sucompat (& filename , NULL , NULL , NULL );
2033+ #endif
20152034 return compat_do_execve (getname (filename ), argv , envp );
20162035}
20172036
0 commit comments