action.yml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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. cd susfs4ksu
  41. COMMIT1="8d2420be13e43d4cc0d80215d08ed475081a1404" # fill in
  42. COMMIT2="ee71ca33d08710d686f2bdba27cacefe9e615fb9" # fill in
  43. git remote add pershoot https://gitlab.com/pershoot/susfs4ksu.git
  44. git fetch pershoot gki-android14-6.1-dev
  45. git cherry-pick "$COMMIT1"
  46. git cherry-pick "$COMMIT2"
  47. - name: Enable Kernel Configs
  48. uses: ./.github/actions/set-kernel-config
  49. with:
  50. config_list: |
  51. CONFIG_KSU_SUSFS=y
  52. CONFIG_KSU_SUSFS_SUS_PATH=y
  53. CONFIG_KSU_SUSFS_SUS_MOUNT=y
  54. CONFIG_KSU_SUSFS_SUS_KSTAT=y
  55. CONFIG_KSU_SUSFS_SPOOF_UNAME=y
  56. CONFIG_KSU_SUSFS_ENABLE_LOG=y
  57. CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS=y
  58. CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG=y
  59. CONFIG_KSU_SUSFS_OPEN_REDIRECT=y
  60. CONFIG_KSU_SUSFS_SUS_MAP=y
  61. - name: Apply Kernel SUSFS Patches
  62. shell: bash
  63. working-directory: ${{ github.workspace }}/kernel/common
  64. run: |
  65. # Apply base SUSFS patches
  66. cp "${{ github.workspace }}/susfs4ksu/kernel_patches/fs/"* "${{ github.workspace }}/kernel/common/fs/"
  67. cp "${{ github.workspace }}/susfs4ksu/kernel_patches/include/linux/"* "${{ github.workspace }}/kernel/common/include/linux/"
  68. cp ${{ github.workspace }}/susfs4ksu/kernel_patches/50_add_susfs_in_gki-${{ inputs.version }}.patch ./
  69. - name: Apply Android 12 5.10 Fake Patches
  70. shell: bash
  71. if: inputs.version == 'android12-5.10'
  72. working-directory: ${{ github.workspace }}/kernel/common
  73. run: |
  74. if [ "${{ inputs.sublevel }}" -le "43" ]; then
  75. echo "Applying base.c Android 12 5.10 Fake Patch"
  76. 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
  77. fi
  78. if [ "${{ inputs.sublevel }}" -le "117" ]; then
  79. echo "Applying fdinfo.c Android 12 5.10 Fake Patch"
  80. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  81. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  82. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  83. fi
  84. - name: Apply Android 13 5.10 Fake Patches
  85. shell: bash
  86. if: inputs.version == 'android13-5.10'
  87. working-directory: ${{ github.workspace }}/kernel/common
  88. run: |
  89. echo "Applying Android 13 5.10 SUSFS fixes"
  90. if [ "${{ inputs.sublevel }}" -le "107" ]; then
  91. echo "Applying fdinfo.c Android 13 5.10 Fake Patch"
  92. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  93. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  94. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  95. fi
  96. - name: Apply Android 13 5.15 Fake Patches
  97. shell: bash
  98. if: inputs.version == 'android13-5.15'
  99. working-directory: ${{ github.workspace }}/kernel/common
  100. run: |
  101. echo "Applying Android 13 5.15 SUSFS fixes"
  102. if [ "${{ inputs.sublevel }}" -le "41" ]; then
  103. #echo "Applying base.c Android 13 5.15 Fake Patch"
  104. #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
  105. echo "Applying namespace.c Android 13 5.15 SUSFS fixes"
  106. sed -i '/^#include <linux\/shmem_fs.h>$/a #include <linux/mnt_idmapping.h>' fs/namespace.c
  107. echo "Applying open.c Android 13 5.15 Fake Patch"
  108. sed -i '/^#include <linux\/compat.h>$/a #include <linux/mnt_idmapping.h>' fs/open.c
  109. echo "Applying fdinfo.c Android 13 5.15 Fake Patch"
  110. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  111. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  112. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  113. fi
  114. if [ "${{ inputs.sublevel }}" -ge "197" ]; then
  115. echo "Applying namespace.c Android 13 5.15 Fake Patch"
  116. sed -i '/^#include <trace\/hooks\/blk.h>$/d' fs/namespace.c
  117. fi
  118. if [ "${{ inputs.sublevel }}" -ge "197" ]; then
  119. echo "Applying task_mmu.c Android 13 5.15 Fake Patch"
  120. sed -i '/^#include <trace\/hooks\/mm.h>$/d' fs/proc/task_mmu.c
  121. fi
  122. - name: Apply Android 14 6.1 Fake Patches
  123. shell: bash
  124. if: inputs.version == 'android14-6.1'
  125. working-directory: ${{ github.workspace }}/kernel/common
  126. run: |
  127. if [ "${{ inputs.sublevel }}" -le "25" ]; then
  128. echo "Applying base.c Android 14 6.1 Fake Patch"
  129. sed -i '/^#include <trace\/events\/oom.h>$/a #include <trace/hooks/sched.h>' fs/proc/base.c
  130. fi
  131. if [ "${{ inputs.sublevel }}" -le "141" ]; then
  132. echo "Applying base.c Android 14 6.1 Fake Patch"
  133. sed -i '/^#include <linux\/cpufreq_times.h>$/a #include <linux/dma-buf.h>' fs/proc/base.c
  134. fi
  135. if [ "${{ inputs.sublevel }}" -ge "157" ]; then
  136. echo "Applying namespace.c Android 14 6.1 Fake Patch"
  137. sed -i '/^#include <trace\/hooks\/blk.h>$/d' fs/namespace.c
  138. fi
  139. - name: Apply Android 15 6.6 Fake Patches
  140. shell: bash
  141. if: inputs.version == 'android15-6.6'
  142. working-directory: ${{ github.workspace }}/kernel/common
  143. run: |
  144. echo "Applying 6.6 SUSFS fixes"
  145. if [ "${{ inputs.sublevel }}" -le "30" ]; then
  146. echo "Applying taskmmu.c Android 15 6.6 Fake Patch"
  147. sed -i '/smap_gather_stats(vma, &mss, last_vma_end);/a\last_vma_end = vma->vm_end;' fs/proc/task_mmu.c
  148. perl -0777 -i -pe '
  149. @l = split /\n/;
  150. for ($i = $#l; $i >= 0; $i--) {
  151. if ($l[$i] =~ /last_vma_end = vma->vm_end;/) {
  152. $l[$i] = "\t\t\t\t" . $l[$i];
  153. splice(@l, $i + 1, 0, "\t\t\t}");
  154. # add { to the if line above
  155. for ($j = $i; $j >= 0; $j--) {
  156. if ($l[$j] =~ /if\s*\(vma->vm_end > last_vma_end\)/) {
  157. $l[$j] =~ s/\)\s*$/) {/;
  158. last;
  159. }
  160. }
  161. last;
  162. }
  163. }
  164. $_ = join "\n", @l
  165. ' fs/proc/task_mmu.c
  166. fi
  167. if [ "${{ inputs.sublevel }}" -le "92" ]; then
  168. echo "Applying base.c Android 15 6.6 Fake Patch"
  169. sed -i '/^#include <linux\/cpufreq_times.h>$/a #include <linux/dma-buf.h>' fs/proc/base.c
  170. fi
  171. if [ "${{ inputs.sublevel }}" -le "57" ]; then
  172. echo "Applying base.c Android 15 6.6 Fake Patch"
  173. sed -i '/^#include <linux\/sched\/sysctl.h>$/a #include <linux/zswap.h>' mm/memory.c
  174. fi
  175. - name: Apply Android 16 6.12 Fake Patches
  176. shell: bash
  177. if: inputs.version == 'android16-6.12'
  178. working-directory: ${{ github.workspace }}/kernel/common
  179. run: |
  180. echo "Applying 6.12 SUSFS fixes"
  181. if [ "${{ inputs.sublevel }}" -ge "58" ]; then
  182. echo "Applying exec.c Android 16 6.12 Fake Patch"
  183. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/exec.c
  184. fi
  185. if [ "${{ inputs.sublevel }}" -ge "69" ]; then
  186. echo "Applying task_mmu.c Android 16 6.12 Fake Patch"
  187. sed -i 's/vma_data_pages/vma_pages/g' fs/proc/task_mmu.c
  188. fi
  189. - name: Apply Kernel SUSFS Patches
  190. shell: bash
  191. working-directory: ${{ github.workspace }}/kernel/common
  192. run: |
  193. patch -p1 < 50_add_susfs_in_gki-${{ inputs.version }}.patch
  194. - name: Revert Android 12 5.10 Fake Patches
  195. shell: bash
  196. if: inputs.version == 'android12-5.10'
  197. working-directory: ${{ github.workspace }}/kernel/common
  198. run: |
  199. if [ "${{ inputs.sublevel }}" -le "43" ]; then
  200. echo "Reverting base.c Android 12 5.10 Fake Patch"
  201. 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
  202. fi
  203. if [ "${{ inputs.sublevel }}" -le "117" ]; then
  204. echo "Reverting fdinfo.c Android 12 5.10 Fake Patch"
  205. 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
  206. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  207. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  208. fi
  209. - name: Revert Android 13 5.10 Fake Patches
  210. shell: bash
  211. if: inputs.version == 'android13-5.10'
  212. working-directory: ${{ github.workspace }}/kernel/common
  213. run: |
  214. if [ "${{ inputs.sublevel }}" -le "107" ]; then
  215. echo "Reverting fdinfo.c Android 13 5.10 Fake Patch"
  216. 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
  217. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  218. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  219. fi
  220. - name: Revert Android 13 5.15 Fake Patches
  221. shell: bash
  222. if: inputs.version == 'android13-5.15'
  223. working-directory: ${{ github.workspace }}/kernel/common
  224. run: |
  225. if [ "${{ inputs.sublevel }}" -le "41" ]; then
  226. #echo "Reverting base.c Android 13 5.15 Fake Patch"
  227. #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
  228. echo "Reverting namespace.c Android 13 5.15 Fake Patch"
  229. sed -i '/#include <linux\/mnt_idmapping.h>$/d' fs/namespace.c
  230. echo "Reverting open.c Android 13 5.15 Fake Patch"
  231. sed -i '/#include <linux\/mnt_idmapping.h>$/d' fs/open.c
  232. echo "Reverting fdinfo.c Android 13 5.15 Fake Patch"
  233. 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
  234. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  235. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  236. 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
  237. 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
  238. fi
  239. if [ "${{ inputs.sublevel }}" -ge "197" ]; then
  240. echo "Reverting namespace.c Android 13 5.15 Fake Patch"
  241. sed -i '/^#include "internal.h"$/a #include <trace/hooks/blk.h>' fs/namespace.c
  242. fi
  243. if [ "${{ inputs.sublevel }}" -ge "206" ]; then
  244. echo "Reverting task_mmu.c Android 13 5.15 Fake Patch"
  245. sed -i '/^#include <linux\/pkeys.h>$/a #include <trace/hooks/mm.h>' fs/proc/task_mmu.c
  246. fi
  247. - name: Revert Android 14 6.1 Fake Patches
  248. shell: bash
  249. if: inputs.version == 'android14-6.1'
  250. working-directory: ${{ github.workspace }}/kernel/common
  251. run: |
  252. if [ "${{ inputs.sublevel }}" -le "25" ]; then
  253. sed -i '/^#include <trace\/hooks\/sched.h>$/d' fs/proc/base.c
  254. fi
  255. if [ "${{ inputs.sublevel }}" -le "141" ]; then
  256. echo "Reverting base.c Android 14 6.1 Fake Patch"
  257. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/proc/base.c
  258. fi
  259. if [ "${{ inputs.sublevel }}" -ge "157" ]; then
  260. echo "Reverting namespace.c Android 14 6.1 Fake Patch"
  261. sed -i '/^#include "internal.h"$/a #include <trace/hooks/blk.h>' fs/namespace.c
  262. fi
  263. - name: Revert Android 15 6.6 Fake Patches
  264. shell: bash
  265. if: inputs.version == 'android15-6.6'
  266. working-directory: ${{ github.workspace }}/kernel/common
  267. run: |
  268. echo "Reverting 6.6 Fake Patches"
  269. if [ "${{ inputs.sublevel }}" -le "92" ]; then
  270. echo "Reverting base.c Android 15 6.6 Fake Patch"
  271. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/proc/base.c
  272. fi
  273. if [ "${{ inputs.sublevel }}" -le "57" ]; then
  274. echo "Reverting memory.c Android 15 6.6 Fake Patch"
  275. sed -i '/^#include <linux\/zswap.h>$/d' mm/memory.c
  276. fi
  277. - name: Revert Android 16 6.12 Fake Patches
  278. shell: bash
  279. if: inputs.version == 'android16-6.12'
  280. working-directory: ${{ github.workspace }}/kernel/common
  281. run: |
  282. echo "Reverting 6.12 Fake Patches"
  283. if [ "${{ inputs.sublevel }}" -ge "58" ]; then
  284. echo "Reverting exec.c Android 16 6.12 Fake Patch"
  285. sed -i '/^#include /a #include <linux/dma-buf.h>' fs/exec.c
  286. fi
  287. if [ "${{ inputs.sublevel }}" -ge "69" ]; then
  288. echo "Reverting task_mmu.c Android 16 6.12 Fake Patch"
  289. sed -i 's/vma_pages/vma_data_pages/g' fs/proc/task_mmu.c
  290. fi
  291. - name: Apply Kernel SUSFS Patches
  292. shell: bash
  293. if: true
  294. working-directory: ${{ github.workspace }}/kernel/common
  295. run: |
  296. SHOW_PAD_FIX=0
  297. if [[ "${{ inputs.version }}" = "android12-5.10" && "${{ inputs.sublevel }}" -le 209 ]]; then
  298. SHOW_PAD_FIX=1
  299. elif [[ "${{ inputs.version }}" = "android13-5.10" && "${{ inputs.sublevel }}" -le 209 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  300. SHOW_PAD_FIX=1
  301. elif [[ "${{ inputs.version }}" = "android13-5.15" && "${{ inputs.sublevel }}" -le 148 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  302. SHOW_PAD_FIX=1
  303. elif [[ "${{ inputs.version }}" = "android14-5.15" && "${{ inputs.sublevel }}" -le 148 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  304. SHOW_PAD_FIX=1
  305. elif [[ "${{ inputs.version }}" = "android14-6.1" && "${{ inputs.sublevel }}" -le 75 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  306. SHOW_PAD_FIX=1
  307. fi
  308. if [[ "$SHOW_PAD_FIX" = "1" ]]; then
  309. sed -i -e 's/goto show_pad;/return 0;/' ./fs/proc/task_mmu.c
  310. fi