action.yml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. name: Setup SUSFS
  2. description: Clone and apply SUSFS patches with version-specific fixes
  3. inputs:
  4. use_latest_commits:
  5. description: 'Use the latest commit on the branch instead of the pinned commit'
  6. required: false
  7. default: true
  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 [ "${{ inputs.use_latest_commits }}" != "true" ]; then
  36. COMMITS_JSON="${{ github.workspace }}/.github/config/commits.json"
  37. SUSFS_COMMIT=$(jq -er --arg key "$SUSFS_BRANCH" '.susfs[$key]' "$COMMITS_JSON")
  38. cd ${{ github.workspace }}/susfs4ksu
  39. git checkout "$SUSFS_COMMIT"
  40. fi
  41. - name: Enable KernelSU SUSFS Config
  42. shell: bash
  43. working-directory: ${{ github.workspace }}/kernel
  44. run: |
  45. cat >> "${{ github.workspace }}/wild_gki.fragment" << 'EOF'
  46. # KernelSU SUSFS Configuration
  47. CONFIG_KSU_SUSFS=y
  48. CONFIG_KSU_SUSFS_SUS_PATH=y
  49. CONFIG_KSU_SUSFS_SUS_MOUNT=y
  50. CONFIG_KSU_SUSFS_SUS_KSTAT=y
  51. CONFIG_KSU_SUSFS_SPOOF_UNAME=y
  52. CONFIG_KSU_SUSFS_ENABLE_LOG=y
  53. CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS=y
  54. CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG=y
  55. CONFIG_KSU_SUSFS_OPEN_REDIRECT=y
  56. CONFIG_KSU_SUSFS_SUS_MAP=y
  57. EOF
  58. - name: Apply KSU SUSFS Patches
  59. if: false
  60. shell: bash
  61. working-directory: ${{ github.workspace }}/kernel/KernelSU-Next
  62. run: |
  63. cp ${{ github.workspace }}/kernel_patches/wild/ksun-5a4a718-susfs-f7ae19ef-gki-android14-6.1.patch ./
  64. patch -p1 < ksun-5a4a718-susfs-f7ae19ef-gki-android14-6.1.patch
  65. - name: Apply Kernel SUSFS Patches
  66. shell: bash
  67. working-directory: ${{ github.workspace }}/kernel/common
  68. run: |
  69. # Apply base SUSFS patches
  70. cp "${{ github.workspace }}/susfs4ksu/kernel_patches/fs/"* "${{ github.workspace }}/kernel/common/fs/"
  71. cp "${{ github.workspace }}/susfs4ksu/kernel_patches/include/linux/"* "${{ github.workspace }}/kernel/common/include/linux/"
  72. cp ${{ github.workspace }}/susfs4ksu/kernel_patches/50_add_susfs_in_gki-${{ inputs.version }}.patch ./
  73. - name: Apply Android 12 5.10 Fake Patches
  74. shell: bash
  75. if: inputs.version == 'android12-5.10'
  76. working-directory: ${{ github.workspace }}/kernel/common
  77. run: |
  78. if [ "${{ inputs.sublevel }}" -le "43" ]; then
  79. echo "Applying base.c Android 12 5.10 Fake Patch"
  80. 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
  81. fi
  82. if [ "${{ inputs.sublevel }}" -le "117" ]; then
  83. echo "Applying fdinfo.c Android 12 5.10 Fake Patch"
  84. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  85. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  86. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  87. fi
  88. - name: Apply Android 13 5.10 Fake Patches
  89. shell: bash
  90. if: inputs.version == 'android13-5.10'
  91. working-directory: ${{ github.workspace }}/kernel/common
  92. run: |
  93. echo "Applying Android 13 5.10 SUSFS fixes"
  94. if [ "${{ inputs.sublevel }}" -le "107" ]; then
  95. echo "Applying fdinfo.c Android 13 5.10 Fake Patch"
  96. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  97. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  98. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  99. fi
  100. - name: Apply Android 13 5.15 Fake Patches
  101. shell: bash
  102. if: inputs.version == 'android13-5.15'
  103. working-directory: ${{ github.workspace }}/kernel/common
  104. run: |
  105. echo "Applying Android 13 5.15 SUSFS fixes"
  106. if [ "${{ inputs.sublevel }}" -le "41" ]; then
  107. #echo "Applying base.c Android 13 5.15 Fake Patch"
  108. #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
  109. echo "Applying namespace.c Android 13 5.15 SUSFS fixes"
  110. sed -i '/^#include <linux\/shmem_fs.h>$/a #include <linux/mnt_idmapping.h>' fs/namespace.c
  111. echo "Applying open.c Android 13 5.15 Fake Patch"
  112. sed -i '/^#include <linux\/compat.h>$/a #include <linux/mnt_idmapping.h>' fs/open.c
  113. echo "Applying fdinfo.c Android 13 5.15 Fake Patch"
  114. sed -i '/^[[:space:]]*\/\*$/,/^[[:space:]]*u32 mask = mark->mask & IN_ALL_EVENTS;$/d' fs/notify/fdinfo.c
  115. perl -i -pe 's/\bmask,\s*mark->ignored_mask/inotify_mark_user_mask(mark)/g' fs/notify/fdinfo.c
  116. perl -i -pe 's/ignored_mask:%x/ignored_mask:0/g' fs/notify/fdinfo.c
  117. fi
  118. if [ "${{ inputs.sublevel }}" -ge "207" ]; 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. fi
  149. if [ "${{ inputs.sublevel }}" -le "92" ]; then
  150. echo "Applying base.c Android 15 6.6 Fake Patch"
  151. sed -i '/^#include <linux\/cpufreq_times.h>$/a #include <linux/dma-buf.h>' fs/proc/base.c
  152. fi
  153. if [ "${{ inputs.sublevel }}" -le "57" ]; then
  154. echo "Applying base.c Android 15 6.6 Fake Patch"
  155. sed -i '/^#include <linux\/sched\/sysctl.h>$/a #include <linux/zswap.h>' mm/memory.c
  156. fi
  157. - name: Apply Android 16 6.12 Fake Patches
  158. shell: bash
  159. if: inputs.version == 'android16-6.12'
  160. working-directory: ${{ github.workspace }}/kernel/common
  161. run: |
  162. echo "Applying 6.12 SUSFS fixes"
  163. if [ "${{ inputs.sublevel }}" -ge "58" ]; then
  164. echo "Applying exec.c Android 16 6.12 Fake Patch"
  165. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/exec.c
  166. fi
  167. if [ "${{ inputs.sublevel }}" -ge "69" ]; then
  168. echo "Applying task_mmu.c Android 16 6.12 Fake Patch"
  169. sed -i 's/vma_pages/vma_data_pages/g' fs/proc/task_mmu.c
  170. fi
  171. - name: Apply Kernel SUSFS Patches
  172. shell: bash
  173. working-directory: ${{ github.workspace }}/kernel/common
  174. run: |
  175. patch -p1 < 50_add_susfs_in_gki-${{ inputs.version }}.patch
  176. - name: Revert Android 12 5.10 Fake Patches
  177. shell: bash
  178. if: inputs.version == 'android12-5.10'
  179. working-directory: ${{ github.workspace }}/kernel/common
  180. run: |
  181. if [ "${{ inputs.sublevel }}" -le "43" ]; then
  182. echo "Reverting base.c Android 12 5.10 Fake Patch"
  183. 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
  184. fi
  185. if [ "${{ inputs.sublevel }}" -le "117" ]; then
  186. echo "Reverting fdinfo.c Android 12 5.10 Fake Patch"
  187. 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
  188. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  189. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  190. fi
  191. - name: Revert Android 13 5.10 Fake Patches
  192. shell: bash
  193. if: inputs.version == 'android13-5.10'
  194. working-directory: ${{ github.workspace }}/kernel/common
  195. run: |
  196. if [ "${{ inputs.sublevel }}" -le "107" ]; then
  197. echo "Reverting fdinfo.c Android 13 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.15 Fake Patches
  203. shell: bash
  204. if: inputs.version == 'android13-5.15'
  205. working-directory: ${{ github.workspace }}/kernel/common
  206. run: |
  207. if [ "${{ inputs.sublevel }}" -le "41" ]; then
  208. #echo "Reverting base.c Android 13 5.15 Fake Patch"
  209. #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
  210. echo "Reverting namespace.c Android 13 5.15 Fake Patch"
  211. sed -i '/#include <linux\/mnt_idmapping.h>$/d' fs/namespace.c
  212. echo "Reverting open.c Android 13 5.15 Fake Patch"
  213. sed -i '/#include <linux\/mnt_idmapping.h>$/d' fs/open.c
  214. echo "Reverting fdinfo.c Android 13 5.15 Fake Patch"
  215. 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
  216. perl -i -pe 's/\binotify_mark_user_mask\(mark\)/mask, mark->ignored_mask/g' fs/notify/fdinfo.c
  217. perl -i -pe 's/ignored_mask:0/ignored_mask:%x/g' fs/notify/fdinfo.c
  218. 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
  219. 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
  220. fi
  221. if [ "${{ inputs.sublevel }}" -ge "207" ]; then
  222. echo "Reverting task_mmu.c Android 13 5.15 Fake Patch"
  223. sed -i '/^#include <linux\/pkeys.h>$/a #include <trace/hooks/mm.h>' fs/proc/task_mmu.c
  224. fi
  225. - name: Revert Android 14 6.1 Fake Patches
  226. shell: bash
  227. if: inputs.version == 'android14-6.1'
  228. working-directory: ${{ github.workspace }}/kernel/common
  229. run: |
  230. if [ "${{ inputs.sublevel }}" -le "25" ]; then
  231. sed -i '/^#include <trace\/hooks\/sched.h>$/d' fs/proc/base.c
  232. fi
  233. if [ "${{ inputs.sublevel }}" -le "141" ]; then
  234. echo "Reverting base.c Android 14 6.1 Fake Patch"
  235. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/proc/base.c
  236. fi
  237. if [ "${{ inputs.sublevel }}" -ge "157" ]; then
  238. echo "Reverting namespace.c Android 14 6.1 Fake Patch"
  239. sed -i '/^#include "internal.h"$/a #include <trace/hooks/blk.h>' fs/namespace.c
  240. fi
  241. - name: Revert Android 15 6.6 Fake Patches
  242. shell: bash
  243. if: inputs.version == 'android15-6.6'
  244. working-directory: ${{ github.workspace }}/kernel/common
  245. run: |
  246. echo "Reverting 6.6 Fake Patches"
  247. if [ "${{ inputs.sublevel }}" -le "92" ]; then
  248. echo "Reverting base.c Android 15 6.6 Fake Patch"
  249. sed -i '/^#include <linux\/dma-buf.h>$/d' fs/proc/base.c
  250. fi
  251. if [ "${{ inputs.sublevel }}" -le "57" ]; then
  252. echo "Reverting memory.c Android 15 6.6 Fake Patch"
  253. sed -i '/^#include <linux\/zswap.h>$/d' mm/memory.c
  254. fi
  255. - name: Revert Android 16 6.12 Fake Patches
  256. shell: bash
  257. if: inputs.version == 'android16-6.12'
  258. working-directory: ${{ github.workspace }}/kernel/common
  259. run: |
  260. echo "Reverting 6.12 Fake Patches"
  261. if [ "${{ inputs.sublevel }}" -ge "58" ]; then
  262. echo "Reverting exec.c Android 16 6.12 Fake Patch"
  263. sed -i '/^#include /a #include <linux/dma-buf.h>' fs/exec.c
  264. fi
  265. if [ "${{ inputs.sublevel }}" -ge "69" ]; then
  266. echo "Reverting task_mmu.c Android 16 6.12 Fake Patch"
  267. sed -i 's/vma_pages/vma_data_pages/g' fs/proc/task_mmu.c
  268. fi
  269. - name: Apply Kernel SUSFS Patches
  270. shell: bash
  271. if: true
  272. working-directory: ${{ github.workspace }}/kernel/common
  273. run: |
  274. SHOW_PAD_FIX=0
  275. if [[ "${{ inputs.version }}" = "android12-5.10" && "${{ inputs.sublevel }}" -le 209 ]]; then
  276. SHOW_PAD_FIX=1
  277. elif [[ "${{ inputs.version }}" = "android13-5.10" && "${{ inputs.sublevel }}" -le 209 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  278. SHOW_PAD_FIX=1
  279. elif [[ "${{ inputs.version }}" = "android13-5.15" && "${{ inputs.sublevel }}" -le 148 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  280. SHOW_PAD_FIX=1
  281. elif [[ "${{ inputs.version }}" = "android14-5.15" && "${{ inputs.sublevel }}" -le 148 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  282. SHOW_PAD_FIX=1
  283. elif [[ "${{ inputs.version }}" = "android14-6.1" && "${{ inputs.sublevel }}" -le 75 && "${{ inputs.os_patch_level }}" != "2024-05" ]]; then
  284. SHOW_PAD_FIX=1
  285. fi
  286. if [[ "$SHOW_PAD_FIX" = "1" ]]; then
  287. sed -i -e 's/goto show_pad;/return 0;/' ./fs/proc/task_mmu.c
  288. fi