Skip to content

Commit a1188e0

Browse files
committed
kernel: handle backports
Legacy kernel builders have to touch their kernel source code anyway so we might as well tell them to backport things to achieve some sort of feature parity. As for others, it is a common thing on the scene to backport things, so this breaks kernel versioning assumptions. As for those, we scan and check kernel source. Required: - get_cred_rcu: context: tiann#2320 (comment) apply: torvalds/linux@97d0fb2 if above conflicts, try: xiaomi-sdm678/android_kernel_xiaomi_mojito@3fbad8b Optional: - path_umount: context: tiann#1464 (comment) apply: xiaomi-sdm678/android_kernel_xiaomi_mojito@2d51422 - strncpy_from_user_nofault for 5.4, apply: torvalds/linux@bd88bb5 for 4.x, apply: xiaomi-sdm678/android_kernel_xiaomi_mojito@424e21f for any failures, check dependency chain of gregkh/linux@f43434e - kernel_read / kernel_write < 4.14, backport chain, tested on 4.9 torvalds/linux@e13ec93 torvalds/linux@bdd1d2d torvalds/linux@c41fbad torvalds/linux@ac452ac - hint, `curl $url.patch | git am` Signed-off-by: backslashxx <[email protected]>
1 parent 08de09b commit a1188e0

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

kernel/Makefile

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,33 @@ $(info -- KernelSU Manager signature hash: $(KSU_EXPECTED_HASH))
5656
ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE)
5757
ccflags-y += -DEXPECTED_HASH=\"$(KSU_EXPECTED_HASH)\"
5858

59+
ifneq ($(shell grep -q "get_cred_rcu" $(srctree)/include/linux/cred.h; echo $$?),0)
60+
$(error You must backport get_cred_rcu - https://github.com/tiann/KernelSU/pull/2320#issuecomment-2564232958 )
61+
endif
62+
5963
ifeq ($(shell grep -q "int path_umount" $(srctree)/fs/namespace.c; echo $$?),0)
60-
ccflags-y += -DKSU_UMOUNT
61-
else
62-
$(info -- Did you know you can backport path_umount to fs/namespace.c from 5.9?)
63-
$(info -- Read: https://kernelsu.org/guide/how-to-integrate-for-non-gki.html#how-to-backport-path-umount)
64+
$(info -- KernelSU/compat: path_umount found)
65+
ccflags-y += -DKSU_HAS_PATH_UMOUNT
66+
endif
67+
68+
ifeq ($(shell grep -q "strncpy_from_user_nofault" $(srctree)/include/linux/uaccess.h; echo $$?),0)
69+
$(info -- KernelSU/compat: strncpy_from_user_nofault found)
70+
ccflags-y += -DKSU_STRNCPY_FROM_USER_NOFAULT
71+
endif
72+
73+
ifeq ($(shell grep -q "strncpy_from_unsafe_user" $(srctree)/include/linux/uaccess.h; echo $$?),0)
74+
$(info -- KernelSU/compat: strncpy_from_unsafe_user found)
75+
ccflags-y += -DKSU_STRNCPY_FROM_UNSAFE_USER
76+
endif
77+
78+
ifeq ($(shell grep -q "ssize_t kernel_read" $(srctree)/fs/read_write.c; echo $$?),0)
79+
$(info -- KernelSU/compat: newer kernel_read found)
80+
ccflags-y += -DKSU_NEW_KERNEL_READ
81+
endif
82+
83+
ifeq ($(shell grep "ssize_t kernel_write" $(srctree)/fs/read_write.c | grep -q "const void" ; echo $$?),0)
84+
$(info -- KernelSU/compat: newer kernel_write found)
85+
ccflags-y += -DKSU_NEW_KERNEL_WRITE
6486
endif
6587

6688
ccflags-y += -Wno-implicit-function-declaration -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat

kernel/kernel_compat.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ struct file *ksu_filp_open_compat(const char *filename, int flags, umode_t mode)
107107
ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
108108
loff_t *pos)
109109
{
110-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
110+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_NEW_KERNEL_READ)
111111
return kernel_read(p, buf, count, pos);
112112
#else
113113
loff_t offset = pos ? *pos : 0;
@@ -122,7 +122,7 @@ ssize_t ksu_kernel_read_compat(struct file *p, void *buf, size_t count,
122122
ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
123123
loff_t *pos)
124124
{
125-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
125+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) || defined(KSU_NEW_KERNEL_WRITE)
126126
return kernel_write(p, buf, count, pos);
127127
#else
128128
loff_t offset = pos ? *pos : 0;
@@ -134,20 +134,19 @@ ssize_t ksu_kernel_write_compat(struct file *p, const void *buf, size_t count,
134134
#endif
135135
}
136136

137-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
137+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) || defined(KSU_STRNCPY_FROM_USER_NOFAULT)
138138
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
139139
long count)
140140
{
141141
return strncpy_from_user_nofault(dst, unsafe_addr, count);
142142
}
143-
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
143+
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0) || defined(KSU_STRNCPY_FROM_UNSAFE_USER)
144144
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
145145
long count)
146146
{
147147
return strncpy_from_unsafe_user(dst, unsafe_addr, count);
148148
}
149-
#else
150-
// Copied from: https://elixir.bootlin.com/linux/v4.9.337/source/mm/maccess.c#L201
149+
#else // Copied from: https://elixir.bootlin.com/linux/v4.9.337/source/mm/maccess.c#L201
151150
long ksu_strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr,
152151
long count)
153152
{

0 commit comments

Comments
 (0)