action.yml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. name: Setup SUSFS
  2. description: Clone and apply SUSFS patches with version-specific fixes
  3. inputs:
  4. susfs_commit:
  5. description: 'SUSFS commit hash (empty = latest on auto-derived gki-{version} branch)'
  6. required: false
  7. default: ""
  8. version:
  9. description: 'Kernel config version (e.g., android15-6.6)'
  10. required: true
  11. android_version:
  12. description: 'Android version (e.g., android15)'
  13. required: true
  14. kernel_version:
  15. description: 'Kernel version (e.g., 6.6)'
  16. required: true
  17. os_patch_level:
  18. description: 'OS patch level (e.g., 2024-07)'
  19. required: true
  20. sublevel:
  21. description: 'Kernel sublevel'
  22. required: true
  23. runs:
  24. using: composite
  25. steps:
  26. - name: Setup SUSFS Branch
  27. shell: bash
  28. run: |
  29. set -euo pipefail
  30. SUSFS_BRANCH="gki-${{ inputs.version }}"
  31. SUSFS_REPO="https://gitlab.com/simonpunk/susfs4ksu.git"
  32. echo "Preparing SUSFS for branch: $SUSFS_BRANCH"
  33. echo "Cloning latest from $SUSFS_BRANCH..."
  34. git clone "$SUSFS_REPO" -b "$SUSFS_BRANCH" susfs4ksu
  35. if [ -n "${{ inputs.susfs_commit }}" ]; then
  36. echo "Checking out SUSFS commit: ${{ inputs.susfs_commit }}"
  37. cd ${{ github.workspace }}/susfs4ksu
  38. git checkout "${{ inputs.susfs_commit }}"
  39. fi
  40. - name: Enable Kernel Configs
  41. uses: ./.github/actions/set-kernel-config
  42. with:
  43. config_list: |
  44. CONFIG_KSU_SUSFS=y
  45. CONFIG_KSU_SUSFS_SUS_PATH=y
  46. CONFIG_KSU_SUSFS_SUS_MOUNT=y
  47. CONFIG_KSU_SUSFS_SUS_KSTAT=y
  48. CONFIG_KSU_SUSFS_SPOOF_UNAME=y
  49. CONFIG_KSU_SUSFS_ENABLE_LOG=y
  50. CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS=y
  51. CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG=y
  52. CONFIG_KSU_SUSFS_OPEN_REDIRECT=y
  53. CONFIG_KSU_SUSFS_SUS_MAP=y
  54. - name: Apply Kernel SUSFS Patches
  55. shell: bash
  56. working-directory: ${{ github.workspace }}/kernel/common
  57. run: |
  58. # Apply base SUSFS patches
  59. cp "${{ github.workspace }}/susfs4ksu/kernel_patches/fs/"* "${{ github.workspace }}/kernel/common/fs/"
  60. cp "${{ github.workspace }}/susfs4ksu/kernel_patches/include/linux/"* "${{ github.workspace }}/kernel/common/include/linux/"
  61. cp ${{ github.workspace }}/susfs4ksu/kernel_patches/50_add_susfs_in_gki-${{ inputs.version }}.patch ./
  62. - name: Apply Android 12 5.10 Fake Patches
  63. shell: bash
  64. if: inputs.version == 'android12-5.10'
  65. working-directory: ${{ github.workspace }}/kernel/common
  66. run: |
  67. if [ "${{ inputs.sublevel }}" -le "43" ]; then
  68. echo "Applying base.c Android 12 5.10 Fake Patch"
  69. perl -i -pe 's/(int|size_t)\s+this_len\s*=\s*min_t\s*\(\s*\1\s*,/size_t this_len = min_t(size_t,/;' fs/proc/base.c
  70. fi
  71. if [ "${{ inputs.sublevel }}" -le "117" ]; then
  72. echo "Applying fdinfo.c Android 12 5.10 Fake Patch"
  73. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  74. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  75. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  76. fi
  77. - name: Apply Android 13 5.10 Fake Patches
  78. shell: bash
  79. if: inputs.version == 'android13-5.10'
  80. working-directory: ${{ github.workspace }}/kernel/common
  81. run: |
  82. echo "Applying Android 13 5.10 SUSFS fixes"
  83. if [ "${{ inputs.sublevel }}" -le "107" ]; then
  84. echo "Applying fdinfo.c Android 13 5.10 Fake Patch"
  85. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  86. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  87. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  88. fi
  89. - name: Apply Android 13 5.15 Fake Patches
  90. shell: bash
  91. if: inputs.version == 'android13-5.15'
  92. working-directory: ${{ github.workspace }}/kernel/common
  93. run: |
  94. echo "Applying Android 13 5.15 SUSFS fixes"
  95. if [ "${{ inputs.sublevel }}" -le "41" ]; then
  96. #echo "Applying base.c Android 13 5.15 Fake Patch"
  97. #sed -i 's/^int this_len = min_t(int, count, PAGE_SIZE);$/size_t this_len = min_t(size_t, count, PAGE_SIZE);/' fs/proc/base.c
  98. echo "Applying namespace.c Android 13 5.15 SUSFS fixes"
  99. sed -i '/^#include <linux\/shmem_fs.h>$/a #include <linux/mnt_idmapping.h>' fs/namespace.c
  100. echo "Applying open.c Android 13 5.15 Fake Patch"
  101. sed -i '/^#include <linux\/compat.h>$/a #include <linux/mnt_idmapping.h>' fs/open.c
  102. echo "Applying fdinfo.c Android 13 5.15 Fake Patch"
  103. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  104. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  105. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  106. fi
  107. if [ "${{ inputs.sublevel }}" -ge "197" ]; then
  108. echo "Applying namespace.c Android 13 5.15 Fake Patch"
  109. sed -i '/^#include <trace\/hooks\/blk.h>$/d' fs/namespace.c
  110. fi
  111. if [ "${{ inputs.sublevel }}" -ge "197" ]; then
  112. echo "Applying task_mmu.c Android 13 5.15 Fake Patch"
  113. sed -i '/^#include <trace\/hooks\/mm.h>$/d' fs/proc/task_mmu.c
  114. fi
  115. - name: Apply Android 14 6.1 Fake Patches
  116. shell: bash
  117. if: inputs.version == 'android14-6.1'
  118. working-directory: ${{ github.workspace }}/kernel/common
  119. run: |
  120. if [ "${{ inputs.sublevel }}" -le "25" ]; then
  121. echo "Applying base.c Android 14 6.1 Fake Patch"
  122. sed -i '/^#include <trace\/events\/oom.h>$/a #include <trace/hooks/sched.h>' fs/proc/base.c
  123. fi
  124. if [ "${{ inputs.sublevel }}" -le "141" ]; then
  125. echo "Applying base.c Android 14 6.1 Fake Patch"
  126. sed -i '/^#include <linux\/cpufreq_times.h>$/a #include <linux/dma-buf.h>' fs/proc/base.c
  127. fi
  128. if [ "${{ inputs.sublevel }}" -ge "157" ]; then
  129. echo "Applying namespace.c Android 14 6.1 Fake Patch"
  130. sed -i '/^#include <trace\/hooks\/blk.h>$/d' fs/namespace.c
  131. fi
  132. - name: Apply Android 15 6.6 Fake Patches
  133. shell: bash
  134. if: inputs.version == 'android15-6.6'
  135. working-directory: ${{ github.workspace }}/kernel/common
  136. run: |
  137. echo "Applying 6.6 SUSFS fixes"
  138. if [ "${{ inputs.sublevel }}" -le "30" ]; then
  139. echo "Applying taskmmu.c Android 15 6.6 Fake Patch"
  140. sed -i '/smap_gather_stats(vma, &mss, last_vma_end);/a\last_vma_end = vma->vm_end;' fs/proc/task_mmu.c
  141. perl -0777 -i -pe '
  142. @l = split /\n/;
  143. for ($i = $#l; $i >= 0; $i--) {
  144. if ($l[$i] =~ /last_vma_end = vma->vm_end;/) {
  145. $l[$i] = "\t\t\t\t" . $l[$i];
  146. splice(@l, $i + 1, 0, "\t\t\t}");
  147. # add { to the if line above
  148. for ($j = $i; $j >= 0; $j--) {
  149. if ($l[$j] =~ /if\s*\(vma->vm_end > last_vma_end\)/) {
  150. $l[$j] =~ s/\)\s*$/) {/;
  151. last;
  152. }
  153. }
  154. last;
  155. }
  156. }
  157. $_ = join "\n", @l
  158. ' fs/proc/task_mmu.c
  159. fi
  160. if [ "${{ inputs.sublevel }}" -le "92" ]; then
  161. echo "Applying base.c Android 15 6.6 Fake Patch"
  162. sed -i '/^#include <linux\/cpufreq_times.h>$/a #include <linux/dma-buf.h>' fs/proc/base.c
  163. fi
  164. if [ "${{ inputs.sublevel }}" -le "57" ]; then
  165. echo "Applying base.c Android 15 6.6 Fake Patch"
  166. sed -i '/^#include <linux\/sched\/sysctl.h>$/a #include <linux/zswap.h>' mm/memory.c
  167. fi
  168. - name: Apply Android 16 6.12 Fake Patches
  169. shell: bash
  170. if: inputs.version == 'android16-6.12'
  171. working-directory: ${{ github.workspace }}/kernel/common
  172. run: |
  173. echo "Applying 6.12 SUSFS fixes"
  174. if [ "${{ inputs.sublevel }}" -ge "58" ]; then
  175. echo "Applying exec.c Android 16 6.12 Fake Patch"
  176. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/exec.c
  177. fi
  178. if [ "${{ inputs.sublevel }}" -ge "69" ]; then
  179. echo "Applying task_mmu.c Android 16 6.12 Fake Patch"
  180. sed -i 's/vma_data_pages/vma_pages/g' fs/proc/task_mmu.c
  181. fi
  182. - name: Apply Kernel SUSFS Patches
  183. shell: bash
  184. working-directory: ${{ github.workspace }}/kernel/common
  185. run: |
  186. patch -p1 < 50_add_susfs_in_gki-${{ inputs.version }}.patch
  187. - name: Revert Android 12 5.10 Fake Patches
  188. shell: bash
  189. if: inputs.version == 'android12-5.10'
  190. working-directory: ${{ github.workspace }}/kernel/common
  191. run: |
  192. if [ "${{ inputs.sublevel }}" -le "43" ]; then
  193. echo "Reverting base.c Android 12 5.10 Fake Patch"
  194. sed -i 's/^size_t this_len = min_t(size_t, count, PAGE_SIZE);$/int this_len = min_t(int, count, PAGE_SIZE);/' fs/proc/base.c
  195. fi
  196. if [ "${{ inputs.sublevel }}" -le "117" ]; then
  197. echo "Reverting fdinfo.c Android 12 5.10 Fake Patch"
  198. perl -i -pe 's/^(\s+if \(inode\) \{)/$1\n\t\t\/\*\n\t\t * IN_ALL_EVENTS represents all of the mask bits\n\t\t * that we expose to userspace. There is at\n\t\t * least one bit (FS_EVENT_ON_CHILD) which is\n\t\t * used only internally to the kernel.\n\t\t *\/\n\t\tu32 mask = mark->mask & IN_ALL_EVENTS;/m' fs/notify/fdinfo.c
  199. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  200. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  201. fi
  202. - name: Revert Android 13 5.10 Fake Patches
  203. shell: bash
  204. if: inputs.version == 'android13-5.10'
  205. working-directory: ${{ github.workspace }}/kernel/common
  206. run: |
  207. if [ "${{ inputs.sublevel }}" -le "107" ]; then
  208. echo "Reverting fdinfo.c Android 13 5.10 Fake Patch"
  209. perl -i -pe 's/^(\s+if \(inode\) \{)/$1\n\t\t\/\*\n\t\t * IN_ALL_EVENTS represents all of the mask bits\n\t\t * that we expose to userspace. There is at\n\t\t * least one bit (FS_EVENT_ON_CHILD) which is\n\t\t * used only internally to the kernel.\n\t\t *\/\n\t\tu32 mask = mark->mask & IN_ALL_EVENTS;/m' fs/notify/fdinfo.c
  210. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  211. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  212. fi
  213. - name: Revert Android 13 5.15 Fake Patches
  214. shell: bash
  215. if: inputs.version == 'android13-5.15'
  216. working-directory: ${{ github.workspace }}/kernel/common
  217. run: |
  218. if [ "${{ inputs.sublevel }}" -le "41" ]; then
  219. #echo "Reverting base.c Android 13 5.15 Fake Patch"
  220. #sed -i 's/^size_t this_len = min_t(size_t, count, PAGE_SIZE);$/int this_len = min_t(int, count, PAGE_SIZE);/' fs/proc/base.c
  221. echo "Reverting namespace.c Android 13 5.15 Fake Patch"
  222. sed -i '/#include <linux\/mnt_idmapping.h>$/d' fs/namespace.c
  223. echo "Reverting open.c Android 13 5.15 Fake Patch"
  224. sed -i '/#include <linux\/mnt_idmapping.h>$/d' fs/open.c
  225. echo "Reverting fdinfo.c Android 13 5.15 Fake Patch"
  226. perl -i -pe 's/^(\s+if \(inode\) \{)/$1\n\t\t\/\*\n\t\t * IN_ALL_EVENTS represents all of the mask bits\n\t\t * that we expose to userspace. There is at\n\t\t * least one bit (FS_EVENT_ON_CHILD) which is\n\t\t * used only internally to the kernel.\n\t\t *\/\n\t\tu32 mask = mark->mask & IN_ALL_EVENTS;/m' fs/notify/fdinfo.c
  227. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  228. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  229. sed -i 's|i_uid_into_mnt(i_user_ns(&fi->inode), &fi->inode).val|i_uid_into_mnt(\&init_user_ns, \&fi->inode).val|g' fs/susfs.c
  230. sed -i 's|i_uid_into_mnt(i_user_ns(inode), inode).val|i_uid_into_mnt(\&init_user_ns, inode).val|g' fs/susfs.c
  231. fi
  232. if [ "${{ inputs.sublevel }}" -ge "197" ]; then
  233. echo "Reverting namespace.c Android 13 5.15 Fake Patch"
  234. sed -i '/^#include "internal.h"$/a #include <trace/hooks/blk.h>' fs/namespace.c
  235. fi
  236. if [ "${{ inputs.sublevel }}" -ge "206" ]; then
  237. echo "Reverting task_mmu.c Android 13 5.15 Fake Patch"
  238. sed -i '/^#include <linux\/pkeys.h>$/a #include <trace/hooks/mm.h>' fs/proc/task_mmu.c
  239. fi
  240. - name: Revert Android 14 6.1 Fake Patches
  241. shell: bash
  242. if: inputs.version == 'android14-6.1'
  243. working-directory: ${{ github.workspace }}/kernel/common
  244. run: |
  245. if [ "${{ inputs.sublevel }}" -le "25" ]; then
  246. sed -i '/^#include <trace\/hooks\/sched.h>$/d' fs/proc/base.c
  247. fi
  248. if [ "${{ inputs.sublevel }}" -le "141" ]; then
  249. echo "Reverting base.c Android 14 6.1 Fake Patch"
  250. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/proc/base.c
  251. fi
  252. if [ "${{ inputs.sublevel }}" -ge "157" ]; then
  253. echo "Reverting namespace.c Android 14 6.1 Fake Patch"
  254. sed -i '/^#include "internal.h"$/a #include <trace/hooks/blk.h>' fs/namespace.c
  255. fi
  256. - name: Revert Android 15 6.6 Fake Patches
  257. shell: bash
  258. if: inputs.version == 'android15-6.6'
  259. working-directory: ${{ github.workspace }}/kernel/common
  260. run: |
  261. echo "Reverting 6.6 Fake Patches"
  262. if [ "${{ inputs.sublevel }}" -le "92" ]; then
  263. echo "Reverting base.c Android 15 6.6 Fake Patch"
  264. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/proc/base.c
  265. fi
  266. if [ "${{ inputs.sublevel }}" -le "57" ]; then
  267. echo "Reverting memory.c Android 15 6.6 Fake Patch"
  268. sed -i '/^#include <linux\/zswap.h>$/d' mm/memory.c
  269. fi
  270. - name: Revert Android 16 6.12 Fake Patches
  271. shell: bash
  272. if: inputs.version == 'android16-6.12'
  273. working-directory: ${{ github.workspace }}/kernel/common
  274. run: |
  275. echo "Reverting 6.12 Fake Patches"
  276. if [ "${{ inputs.sublevel }}" -ge "58" ]; then
  277. echo "Reverting exec.c Android 16 6.12 Fake Patch"
  278. sed -i '/^#include /a #include <linux/dma-buf.h>' fs/exec.c
  279. fi
  280. if [ "${{ inputs.sublevel }}" -ge "69" ]; then
  281. echo "Reverting task_mmu.c Android 16 6.12 Fake Patch"
  282. sed -i 's/vma_pages/vma_data_pages/g' fs/proc/task_mmu.c
  283. fi
  284. - name: Apply Kernel SUSFS Patches
  285. shell: bash
  286. if: true
  287. working-directory: ${{ github.workspace }}/kernel/common
  288. run: |
  289. SHOW_PAD_FIX=0
  290. if [[ "${{ inputs.version }}" = "android12-5.10" && "${{ inputs.sublevel }}" -le 209 ]]; then
  291. SHOW_PAD_FIX=1
  292. elif [[ "${{ inputs.version }}" = "android13-5.10" && "${{ inputs.sublevel }}" -le 209 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  293. SHOW_PAD_FIX=1
  294. elif [[ "${{ inputs.version }}" = "android13-5.15" && "${{ inputs.sublevel }}" -le 148 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  295. SHOW_PAD_FIX=1
  296. elif [[ "${{ inputs.version }}" = "android14-5.15" && "${{ inputs.sublevel }}" -le 148 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  297. SHOW_PAD_FIX=1
  298. elif [[ "${{ inputs.version }}" = "android14-6.1" && "${{ inputs.sublevel }}" -le 75 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  299. SHOW_PAD_FIX=1
  300. fi
  301. if [[ "$SHOW_PAD_FIX" = "1" ]]; then
  302. sed -i -e 's/goto show_pad;/return 0;/' ./fs/proc/task_mmu.c
  303. fi