diff --git a/syscall_hook/min_scope_syscall_hooks_v1.4 (4.14 and older).patch b/syscall_hook/min_scope_syscall_hooks_v1.4 (4.14 and older).patch new file mode 100644 index 0000000..7416a89 --- /dev/null +++ b/syscall_hook/min_scope_syscall_hooks_v1.4 (4.14 and older).patch @@ -0,0 +1,145 @@ +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -2095,11 +2095,26 @@ void set_dumpable(struct mm_struct *mm, int value) + set_mask_bits(&mm->flags, MMF_DUMPABLE_MASK, value); + } + ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++extern bool ksu_execveat_hook __read_mostly; ++extern __attribute__((hot, always_inline)) int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user, ++ void *__never_use_argv, void *__never_use_envp, ++ int *__never_use_flags); ++extern int ksu_handle_execve_ksud(const char __user *filename_user, ++ const char __user *const __user *__argv); ++#endif ++ + SYSCALL_DEFINE3(execve, + const char __user *, filename, + const char __user *const __user *, argv, + const char __user *const __user *, envp) + { ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++ if (unlikely(ksu_execveat_hook)) ++ ksu_handle_execve_ksud(filename, argv); ++ else ++ ksu_handle_execve_sucompat((int *)AT_FDCWD, &filename, NULL, NULL, NULL); ++#endif + return do_execve(getname(filename), argv, envp); + } + +@@ -2119,6 +2138,10 @@ COMPAT_SYSCALL_DEFINE3(execve, const char __user *, filename, + const compat_uptr_t __user *, argv, + const compat_uptr_t __user *, envp) + { ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) // 32-bit su and 32-on-64 support ++ if (!ksu_execveat_hook) ++ ksu_handle_execve_sucompat((int *)AT_FDCWD, &filename, NULL, NULL, NULL); ++#endif + return compat_do_execve(getname(filename), argv, envp); + } +--- a/fs/open.c ++++ b/fs/open.c +@@ -353,6 +353,11 @@ SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len) + } + return error; + } ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++extern __attribute__((hot)) int ++ ksu_handle_faccessat(int *dfd, const char __user **filename_user, ++ int *mode, int *flags); ++#endif + + /* + * access() needs to use the real uid/gid, not the effective uid/gid. +@@ -368,6 +373,9 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) + struct vfsmount *mnt; + int res; + unsigned int lookup_flags = LOOKUP_FOLLOW; ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++ ksu_handle_faccessat(&dfd, &filename, &mode, NULL); ++#endif + + if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ + return -EINVAL; +--- a/fs/stat.c ++++ b/fs/stat.c +@@ -353,6 +353,10 @@ SYSCALL_DEFINE2(newlstat, const char __user *, filename, + return cp_new_stat(&stat, statbuf); + } + ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++extern __attribute__((hot, always_inline)) int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags); ++#endif ++ + #if !defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_SYS_NEWFSTATAT) + SYSCALL_DEFINE4(newfstatat, int, dfd, const char __user *, filename, + struct stat __user *, statbuf, int, flag) +@@ -360,6 +364,9 @@ SYSCALL_DEFINE4(newfstatat, int, dfd, const char __user *, filename, + struct kstat stat; + int error; + ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++ ksu_handle_stat(&dfd, &filename, &flag); ++#endif + error = vfs_fstatat(dfd, filename, &stat, flag); + if (error) + return error; +@@ -504,6 +511,9 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, const char __user *, filename, + struct kstat stat; + int error; + ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++ ksu_handle_stat(&dfd, &filename, &flag); ++#endif + error = vfs_fstatat(dfd, filename, &stat, flag); + if (error) + return error; +--- a/drivers/input/input.c ++++ b/drivers/input/input.c +@@ -436,11 +436,21 @@ static void input_handle_event(struct input_dev *dev, + * to 'seed' initial state of a switch or initial position of absolute + * axis, etc. + */ ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++extern bool ksu_input_hook __read_mostly; ++extern int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code, int *value); ++#endif ++ + void input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) + { + unsigned long flags; + ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++ if (unlikely(ksu_input_hook)) ++ ksu_handle_input_handle_event(&type, &code, &value); ++#endif ++ + if (is_event_supported(type, dev->evbit, EV_MAX)) { + + spin_lock_irqsave(&dev->event_lock, flags); +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -567,6 +567,11 @@ static inline void file_pos_write(struct file *file, loff_t pos) + if ((file->f_mode & FMODE_STREAM) == 0) + file->f_pos = pos; + } ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++extern bool ksu_vfs_read_hook __read_mostly; ++extern int ksu_handle_sys_read(unsigned int fd, char __user **buf_ptr, ++ size_t *count_ptr); ++#endif + + SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) + { +@@ -575,6 +580,10 @@ SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) + + if (f.file) { + loff_t pos = file_pos_read(f.file); ++#if defined(CONFIG_KSU) && !defined(CONFIG_KSU_KPROBES_HOOK) ++ if (unlikely(ksu_vfs_read_hook)) ++ ksu_handle_sys_read(fd, &buf, &count); ++#endif + ret = vfs_read(f.file, buf, count, &pos); + if (ret >= 0) + file_pos_write(f.file, pos); \ No newline at end of file diff --git a/syscall_hook/min_scope_syscall_hooks_v1.4.patch b/syscall_hook/min_scope_syscall_hooks_v1.4 (4.19 and newer).patch similarity index 100% rename from syscall_hook/min_scope_syscall_hooks_v1.4.patch rename to syscall_hook/min_scope_syscall_hooks_v1.4 (4.19 and newer).patch