diff --git a/kernel/supercall/dispatch.c b/kernel/supercall/dispatch.c index 1990b5d146b6..17e9d87a701b 100644 --- a/kernel/supercall/dispatch.c +++ b/kernel/supercall/dispatch.c @@ -41,6 +41,34 @@ static int do_get_info(void __user *arg) { struct ksu_get_info_cmd cmd = { .version = KERNEL_SU_VERSION, .flags = 0 }; +#ifdef MODULE + cmd.flags |= KSU_GET_INFO_FLAG_LKM; +#endif + + if (is_manager()) { + cmd.flags |= KSU_GET_INFO_FLAG_MANAGER; + } + if (ksu_late_loaded) { + cmd.flags |= KSU_GET_INFO_FLAG_LATE_LOAD; + } +#ifdef EXPECTED_SIZE2 + cmd.flags |= KSU_GET_INFO_FLAG_PR_BUILD; +#endif + cmd.features = KSU_FEATURE_MAX; + cmd.uapi_version = KERNEL_SU_UAPI_VERSION; + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("get_version: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_get_info_legacy(void __user *arg) +{ + struct ksu_get_info_legacy_cmd cmd = { .version = KERNEL_SU_VERSION, .flags = 0 }; + #ifdef MODULE cmd.flags |= KSU_GET_INFO_FLAG_LKM; #endif @@ -669,6 +697,12 @@ static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = { .handler = do_get_info, .perm_check = always_allow }, + { + .cmd = KSU_IOCTL_GET_INFO_LEGACY, + .name = "GET_INFO_LEGACY", + .handler = do_get_info_legacy, + .perm_check = always_allow + }, { .cmd = KSU_IOCTL_REPORT_EVENT, .name = "REPORT_EVENT", diff --git a/manager/app/src/main/cpp/jni.cc b/manager/app/src/main/cpp/jni.cc index c78c4e8a2be6..4d2b117c40be 100644 --- a/manager/app/src/main/cpp/jni.cc +++ b/manager/app/src/main/cpp/jni.cc @@ -23,6 +23,18 @@ Java_me_weishu_kernelsu_Natives_getVersion(JNIEnv *env, jobject) { return legacy_get_info().first; } +extern "C" +JNIEXPORT jint JNICALL +Java_me_weishu_kernelsu_Natives_getKernelUAPIVersion(JNIEnv *env, jobject) { + return get_kernel_uapi_version(); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_me_weishu_kernelsu_Natives_getManagerUAPIVersion(JNIEnv *env, jobject) { + return get_manager_uapi_version(); +} + extern "C" JNIEXPORT jint JNICALL Java_me_weishu_kernelsu_Natives_getSuperuserCount(JNIEnv *env, jobject) { diff --git a/manager/app/src/main/cpp/ksu.cc b/manager/app/src/main/cpp/ksu.cc index e80477005deb..f2148b07b8f2 100644 --- a/manager/app/src/main/cpp/ksu.cc +++ b/manager/app/src/main/cpp/ksu.cc @@ -79,11 +79,23 @@ static struct ksu_get_info_cmd g_version {}; struct ksu_get_info_cmd get_info() { if (!g_version.version) { - ksuctl(KSU_IOCTL_GET_INFO, &g_version); + if (ksuctl(KSU_IOCTL_GET_INFO, &g_version) < 0) { + ksuctl(KSU_IOCTL_GET_INFO_LEGACY, &g_version); + g_version.uapi_version = 0; + } } return g_version; } +uint32_t get_kernel_uapi_version() { + auto info = get_info(); + return info.uapi_version; +} + +uint32_t get_manager_uapi_version() { + return KERNEL_SU_UAPI_VERSION; +} + uint32_t get_version() { auto info = get_info(); return info.version; diff --git a/manager/app/src/main/cpp/ksu.h b/manager/app/src/main/cpp/ksu.h index 7a6a44ca4c92..011f9e0e746f 100644 --- a/manager/app/src/main/cpp/ksu.h +++ b/manager/app/src/main/cpp/ksu.h @@ -12,6 +12,10 @@ #include "uapi/ksu.h" +uint32_t get_kernel_uapi_version(); + +uint32_t get_manager_uapi_version(); + uint32_t get_version(); bool uid_should_umount(int uid); diff --git a/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt b/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt index c6275bf7f0df..0c9e91e2166a 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/Natives.kt @@ -21,7 +21,8 @@ object Natives { // 32310: new get_allow_list ioctl // 32336: new set_sepolicy ioctl // 32377: add set_init_pgrp ioctl - const val MINIMAL_SUPPORTED_KERNEL = 32377 + // 32513: add uapi version + const val MINIMAL_SUPPORTED_KERNEL = 32513 const val KERNEL_SU_DOMAIN = "u:r:ksu:s0" @@ -114,8 +115,18 @@ object Natives { } } + val kernelUAPIVersion: Int + external get + + val managerUAPIVersion: Int + external get + + fun checkUAPIMismatch(): Boolean { + return kernelUAPIVersion != managerUAPIVersion + } + fun requireNewKernel(): Boolean { - return version != -1 && version < MINIMAL_SUPPORTED_KERNEL + return (version != -1 && version < MINIMAL_SUPPORTED_KERNEL) || checkUAPIMismatch() } @Keep diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt index f878a5fdfb58..40ac290ee92a 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMaterial.kt @@ -47,6 +47,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import me.weishu.kernelsu.KernelVersion +import me.weishu.kernelsu.Natives import me.weishu.kernelsu.R import me.weishu.kernelsu.ui.component.dialog.rememberConfirmDialog import me.weishu.kernelsu.ui.component.material.TonalCard @@ -94,15 +95,34 @@ fun HomePagerMaterial( if (state.showGkiWarning) { WarningCard(stringResource(id = R.string.home_gki_warning)) } - if (state.showRequireKernelWarning) { + if (state.showUAPIMisMatchWarning) { WarningCard( stringResource( - id = R.string.require_kernel_version, - state.ksuVersion ?: 0, - me.weishu.kernelsu.Natives.MINIMAL_SUPPORTED_KERNEL + id = R.string.uapi_mismatch, + state.managerUAPIVersion, + state.kernelUAPIVersion ?: 0, ) ) } + if (state.showRequireKernelWarning) { + if (state.currentManagerVersionCode < (state.ksuVersion ?: 0)) { + WarningCard( + stringResource( + id = R.string.require_manager_version, + state.currentManagerVersionCode, + state.ksuVersion ?: 0, + ) + ) + } else { + WarningCard( + stringResource( + id = R.string.require_kernel_version, + state.ksuVersion ?: 0, + Natives.MINIMAL_SUPPORTED_KERNEL + ) + ) + } + } if (state.showRootWarning) { WarningCard(stringResource(id = R.string.grant_root_failed)) } @@ -232,7 +252,7 @@ private fun StatusCard( } Spacer(Modifier.height(4.dp)) Text( - text = stringResource(R.string.home_working_version, state.ksuVersion), + text = stringResource(R.string.home_working_version, "${state.ksuVersion}/${state.kernelUAPIVersion}"), style = MaterialTheme.typography.bodyMedium ) } @@ -584,4 +604,7 @@ private fun previewHomeScreenState( superuserCount = superuserCount, moduleCount = moduleCount, systemInfo = previewSystemInfo.copy(selinuxStatus = selinuxStatus), + kernelUAPIVersion = 1, + managerUAPIVersion = 1, + uapiMismatch = false ) diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt index 237dd25f4b18..07a7fa9f8ad9 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeMiuix.kt @@ -131,14 +131,34 @@ fun HomePagerMiuix( if (state.showGkiWarning) { WarningCard(stringResource(id = R.string.home_gki_warning)) } - if (state.showRequireKernelWarning) { + if (state.showUAPIMisMatchWarning) { WarningCard( stringResource( - id = R.string.require_kernel_version, - state.ksuVersion ?: 0, me.weishu.kernelsu.Natives.MINIMAL_SUPPORTED_KERNEL - ), + id = R.string.uapi_mismatch, + state.managerUAPIVersion, + state.kernelUAPIVersion ?: 0, + ) ) } + if (state.showRequireKernelWarning) { + if (state.currentManagerVersionCode < (state.ksuVersion ?: 0)) { + WarningCard( + stringResource( + id = R.string.require_manager_version, + state.currentManagerVersionCode, + state.ksuVersion ?: 0, + ) + ) + } else { + WarningCard( + stringResource( + id = R.string.require_kernel_version, + state.ksuVersion ?: 0, + me.weishu.kernelsu.Natives.MINIMAL_SUPPORTED_KERNEL + ) + ) + } + } if (state.showRootWarning) { WarningCard(stringResource(id = R.string.grant_root_failed)) } @@ -293,7 +313,7 @@ private fun StatusCard( Spacer(Modifier.height(2.dp)) Text( modifier = Modifier.fillMaxWidth(), - text = stringResource(R.string.home_working_version, state.ksuVersion), + text = stringResource(R.string.home_working_version, "${state.ksuVersion}/${state.kernelUAPIVersion}"), fontSize = 14.sp, fontWeight = FontWeight.Medium, ) @@ -656,4 +676,7 @@ private fun previewHomeScreenState( superuserCount = superuserCount, moduleCount = moduleCount, systemInfo = previewSystemInfo.copy(selinuxStatus = selinuxStatus), + kernelUAPIVersion = 1, + managerUAPIVersion = 1, + uapiMismatch = false, ) diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt index b870d5c6bdc0..1448e057bc40 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/home/HomeUiState.kt @@ -8,11 +8,14 @@ import me.weishu.kernelsu.ui.util.module.LatestVersionInfo data class HomeUiState( val kernelVersion: KernelVersion, val ksuVersion: Int?, + val managerUAPIVersion: Int, + val kernelUAPIVersion: Int?, val lkmMode: Boolean?, val isManager: Boolean, val isManagerPrBuild: Boolean, val isKernelPrBuild: Boolean, val requiresNewKernel: Boolean, + val uapiMismatch: Boolean, val isRootAvailable: Boolean, val isSafeMode: Boolean, val isLateLoadMode: Boolean, @@ -35,6 +38,9 @@ data class HomeUiState( val showRequireKernelWarning: Boolean get() = isManager && requiresNewKernel + val showUAPIMisMatchWarning: Boolean + get() = isManager && showRequireKernelWarning && uapiMismatch + val showRootWarning: Boolean get() = ksuVersion != null && !isRootAvailable diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt index 13bd02001b15..0ca1fbc6d1a9 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/HomeViewModel.kt @@ -47,6 +47,8 @@ class HomeViewModel : ViewModel() { val kernelVersion = getKernelVersion() val isManager = Natives.isManager val ksuVersion = if (isManager) Natives.version else null + val kernelUAPIVersion = if (isManager) Natives.kernelUAPIVersion else null + val managerUAPIVersion = Natives.managerUAPIVersion val lkmMode = ksuVersion?.let { if (kernelVersion.isGKI()) Natives.isLkmMode else null } val isRootAvailable = rootAvailable() val managerVersion = getManagerVersion(ksuApp) @@ -59,6 +61,9 @@ class HomeViewModel : ViewModel() { isManagerPrBuild = BuildConfig.IS_PR_BUILD, isKernelPrBuild = Natives.isPrBuild, requiresNewKernel = isManager && Natives.requireNewKernel(), + uapiMismatch = isManager && Natives.checkUAPIMismatch(), + kernelUAPIVersion = kernelUAPIVersion, + managerUAPIVersion = managerUAPIVersion, isRootAvailable = isRootAvailable, isSafeMode = Natives.isSafeMode, isLateLoadMode = Natives.isLateLoadMode, @@ -70,7 +75,7 @@ class HomeViewModel : ViewModel() { moduleCount = getModuleCount(), systemInfo = SystemInfo( kernelVersion = Os.uname().release, - managerVersion = "${managerVersion.versionName} (${managerVersion.versionCode})", + managerVersion = "${managerVersion.versionName} (${managerVersion.versionCode}/${managerUAPIVersion})", deviceModel = resolveDeviceName(), fingerprint = Build.FINGERPRINT, selinuxStatus = getSELinuxStatusRaw(), diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml index e7bbac3ee577..4f37d856daa0 100644 --- a/manager/app/src/main/res/values-ar/strings.xml +++ b/manager/app/src/main/res/values-ar/strings.xml @@ -4,7 +4,7 @@ غير مثبت إضغط للتثبيت يعمل - الإصدار: %d + الإصدار: %s غير مدعوم KernelSU يدعم GKI kernels فقط إصدار النواة diff --git a/manager/app/src/main/res/values-az/strings.xml b/manager/app/src/main/res/values-az/strings.xml index d6469a6f37c2..60bece117770 100644 --- a/manager/app/src/main/res/values-az/strings.xml +++ b/manager/app/src/main/res/values-az/strings.xml @@ -5,7 +5,7 @@ Yüklənmədi Yükləmək üçün toxunun İşləyir - Versiya: %d + Versiya: %s Hal-hazırda KernelSU yalnız GKI nüvələrini dəstəkləyir Dəstəklənmir Yüklə diff --git a/manager/app/src/main/res/values-bg/strings.xml b/manager/app/src/main/res/values-bg/strings.xml index 9ecc56c6c69c..7922819ae1a0 100644 --- a/manager/app/src/main/res/values-bg/strings.xml +++ b/manager/app/src/main/res/values-bg/strings.xml @@ -4,7 +4,7 @@ Не е инсталирано Натиснете да инсталирате Работи - Версия: %d + Версия: %s Неподдържано KernelSU само поддържа GKI кернели за сега. Версия на кернела diff --git a/manager/app/src/main/res/values-bn-rBD/strings.xml b/manager/app/src/main/res/values-bn-rBD/strings.xml index 21416a1db4b8..63e51ec64390 100644 --- a/manager/app/src/main/res/values-bn-rBD/strings.xml +++ b/manager/app/src/main/res/values-bn-rBD/strings.xml @@ -30,7 +30,7 @@ পারমিসিভ মোডিউল ডিসেবল করা যায়নি: %s কোনো মোডিউল ইন্সটল করা নেই - সংস্করণ: %d + সংস্করণ: %s নেইম স্পেস মাউন্ট ইনহেরিটেড ইন্ডিভিজুয়াল diff --git a/manager/app/src/main/res/values-bn/strings.xml b/manager/app/src/main/res/values-bn/strings.xml index 50d91ca4cb0c..284c528a0604 100644 --- a/manager/app/src/main/res/values-bn/strings.xml +++ b/manager/app/src/main/res/values-bn/strings.xml @@ -4,7 +4,7 @@ ইনস্টল করা হয়নি ইনস্টল করার জন্য ক্লিক করুন ওয়ার্কিং - ওয়ার্কিং সংস্করণ: %d + ওয়ার্কিং সংস্করণ: %s অসমর্থিত KernelSU শুধুমাত্র GKI কার্নেল সমর্থন করে কার্নেল সংস্করণ diff --git a/manager/app/src/main/res/values-bs/strings.xml b/manager/app/src/main/res/values-bs/strings.xml index 0f47c42f67f4..77301de7abef 100644 --- a/manager/app/src/main/res/values-bs/strings.xml +++ b/manager/app/src/main/res/values-bs/strings.xml @@ -49,7 +49,7 @@ Pravila Neuspješno ažuriranje SELinux pravila za: %s Radi - Verzija: %d + Verzija: %s Kernel verzija Permisivno Deinstalirajte diff --git a/manager/app/src/main/res/values-da/strings.xml b/manager/app/src/main/res/values-da/strings.xml index bb386fe9ad8c..b847f767b758 100644 --- a/manager/app/src/main/res/values-da/strings.xml +++ b/manager/app/src/main/res/values-da/strings.xml @@ -50,7 +50,7 @@ Opdatering af SELinux-regler mislykkedes for %s Start download: %s Klik for at installere - Version: %d + Version: %s Hjem Ikke installeret Fingeraftryk diff --git a/manager/app/src/main/res/values-de/strings.xml b/manager/app/src/main/res/values-de/strings.xml index 9451397bf084..b3a615e24fb4 100644 --- a/manager/app/src/main/res/values-de/strings.xml +++ b/manager/app/src/main/res/values-de/strings.xml @@ -4,7 +4,7 @@ Nicht installiert Permissiv Funktioniert - Version: %d + Version: %s Superuser Tippe zum Installieren Unbekannt diff --git a/manager/app/src/main/res/values-es/strings.xml b/manager/app/src/main/res/values-es/strings.xml index 048f3733b5af..90028e226534 100644 --- a/manager/app/src/main/res/values-es/strings.xml +++ b/manager/app/src/main/res/values-es/strings.xml @@ -4,7 +4,7 @@ No instalado Haz clic para instalar Funcionando - Versión: %d + Versión: %s Sin soporte KernelSU solo admite kernels GKI por ahora Versión del kernel diff --git a/manager/app/src/main/res/values-et/strings.xml b/manager/app/src/main/res/values-et/strings.xml index 294a68ea871a..4a67be83ae75 100644 --- a/manager/app/src/main/res/values-et/strings.xml +++ b/manager/app/src/main/res/values-et/strings.xml @@ -1,7 +1,7 @@ Töötamine - Versioon: %d + Versioon: %s Tuum Manageri versioon Sõrmejälg diff --git a/manager/app/src/main/res/values-fa/strings.xml b/manager/app/src/main/res/values-fa/strings.xml index 8000037eb778..ad9c150f4fac 100644 --- a/manager/app/src/main/res/values-fa/strings.xml +++ b/manager/app/src/main/res/values-fa/strings.xml @@ -4,7 +4,7 @@ نصب نشده است برای نصب ضربه بزنید به درستی کار می‌کند - نسخه: %d + نسخه: %s پشتیبانی نشده کرنل اس یو فقط هسته های gki را پشتیبانی میکند هسته diff --git a/manager/app/src/main/res/values-fil/strings.xml b/manager/app/src/main/res/values-fil/strings.xml index 22d911c0a642..ccb5b3f46a1f 100644 --- a/manager/app/src/main/res/values-fil/strings.xml +++ b/manager/app/src/main/res/values-fil/strings.xml @@ -8,7 +8,7 @@ Panimula I-click para i-install Gumagana - Bersyon: %d + Bersyon: %s Hindi matukoy Hindi Suportado Sinusuportahan lamang ng KernelSU ang mga GKI na kernel. diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml index 74c33b45e84c..a54a5692f438 100644 --- a/manager/app/src/main/res/values-fr/strings.xml +++ b/manager/app/src/main/res/values-fr/strings.xml @@ -2,7 +2,7 @@ Non installé Fonctionnel - Version : %d + Version : %s KernelSU prend désormais en charge seulement les noyaux GKI, mais vous pouvez patcher l\'image pour les appareils GKI. Version du noyau Empreinte diff --git a/manager/app/src/main/res/values-hi/strings.xml b/manager/app/src/main/res/values-hi/strings.xml index d8e0db9657ef..4a0ecfe2f196 100644 --- a/manager/app/src/main/res/values-hi/strings.xml +++ b/manager/app/src/main/res/values-hi/strings.xml @@ -45,7 +45,7 @@ मॉड्यूल निर्माता हमारे बारे में - वर्जन: %d + वर्जन: %s रीबूट करें KernelSU अभी केवल GKI कर्नल्स को सपोर्ट करता है SELinux स्थिति diff --git a/manager/app/src/main/res/values-hr/strings.xml b/manager/app/src/main/res/values-hr/strings.xml index bd6da57bb9ab..76001aa8a327 100644 --- a/manager/app/src/main/res/values-hr/strings.xml +++ b/manager/app/src/main/res/values-hr/strings.xml @@ -7,7 +7,7 @@ Nije uspjelo ažuriranje SELinux pravila za %s Početna Nije instalirano - Verzija: %d + Verzija: %s Kliknite da instalirate Radi Nepodržano diff --git a/manager/app/src/main/res/values-hu/strings.xml b/manager/app/src/main/res/values-hu/strings.xml index b25111cb5ba4..c57491563b4a 100644 --- a/manager/app/src/main/res/values-hu/strings.xml +++ b/manager/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ Működik - Verzió: %d + Verzió: %s A KernelSU jelenleg csak GKI kerneleket támogat Kernel Alkalmazás verziója diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml index 968d8b09b40b..bb7828f7df0b 100644 --- a/manager/app/src/main/res/values-in/strings.xml +++ b/manager/app/src/main/res/values-in/strings.xml @@ -4,7 +4,7 @@ Tidak terpasang Ketuk untuk memasang Berfungsi - Versi: %d + Versi: %s Tidak didukung KernelSU sekarang hanya mendukung kernel GKI, tetapi Anda dapat menambal image untuk perangkat GKI. Versi kernel diff --git a/manager/app/src/main/res/values-it/strings.xml b/manager/app/src/main/res/values-it/strings.xml index 53f9a5819204..54aad2089b9f 100644 --- a/manager/app/src/main/res/values-it/strings.xml +++ b/manager/app/src/main/res/values-it/strings.xml @@ -4,7 +4,7 @@ Non installato Clicca per installare In esecuzione - Versione: %d + Versione: %s Non supportato KernelSU ora supporta solo i kernel GKI Kernel diff --git a/manager/app/src/main/res/values-iw/strings.xml b/manager/app/src/main/res/values-iw/strings.xml index b64a08016faf..447c25da2c87 100644 --- a/manager/app/src/main/res/values-iw/strings.xml +++ b/manager/app/src/main/res/values-iw/strings.xml @@ -45,7 +45,7 @@ מודולים יוצר אודות - גרסה: %d + גרסה: %s הפעלה מחדש KernelSU תומך רק בליבת GKI כעת סטטוס SELinux diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index 0ea2348d116b..c41a40bbf52e 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -4,7 +4,7 @@ 未インストール タップしてインストール 動作中 - バージョン: %d + バージョン: %s 非対応 KernelSU は現在 GKI カーネルのみをサポートしています。ただし、GKI デバイス向けにイメージにパッチを適用することは可能です。 カーネル diff --git a/manager/app/src/main/res/values-kn/strings.xml b/manager/app/src/main/res/values-kn/strings.xml index db651c171fbe..f130bdcdede9 100644 --- a/manager/app/src/main/res/values-kn/strings.xml +++ b/manager/app/src/main/res/values-kn/strings.xml @@ -37,7 +37,7 @@ ಮಾಡ್ಯೂಲ್ ಲೇಖಕ ಬಗ್ಗೆ - ವರ್ಷನ್: %d + ವರ್ಷನ್: %s ರೀಬೂಟ್ KernelSU ಈಗ GKI ಕರ್ನಲ್‌ಗಳನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ SELinux ಸ್ಥಿತಿ diff --git a/manager/app/src/main/res/values-ko/strings.xml b/manager/app/src/main/res/values-ko/strings.xml index 48f7e177714f..323a2cd9e707 100644 --- a/manager/app/src/main/res/values-ko/strings.xml +++ b/manager/app/src/main/res/values-ko/strings.xml @@ -4,7 +4,7 @@ 설치되지 않음 이 곳을 눌러 설치하기 작동 중 - 버전: %d + 버전: %s 지원되지 않음 KernelSU는 현재 GKI 커널만 지원합니다. 커널 버전 diff --git a/manager/app/src/main/res/values-lt/strings.xml b/manager/app/src/main/res/values-lt/strings.xml index 15a2e8d937ab..25a9570c85aa 100644 --- a/manager/app/src/main/res/values-lt/strings.xml +++ b/manager/app/src/main/res/values-lt/strings.xml @@ -58,7 +58,7 @@ KernelSU dabar palaiko tik GKI branduolius Spustelėkite norėdami įdiegti Veikia - Versija: %d + Versija: %s Nepalaikoma Tvarkyklės versija Branduolys diff --git a/manager/app/src/main/res/values-lv/strings.xml b/manager/app/src/main/res/values-lv/strings.xml index 6eeb688413d9..39e7d663eadf 100644 --- a/manager/app/src/main/res/values-lv/strings.xml +++ b/manager/app/src/main/res/values-lv/strings.xml @@ -12,7 +12,7 @@ Nav uzstādīts Noklikšķiniet, lai uzstādītu Darbojas - Versija: %d + Versija: %s Neatbalstīts KernelSU pagaidām atbalsta tikai GKI kodolus Kodols diff --git a/manager/app/src/main/res/values-mr/strings.xml b/manager/app/src/main/res/values-mr/strings.xml index b1d37a5f91bb..3eccee77ac61 100644 --- a/manager/app/src/main/res/values-mr/strings.xml +++ b/manager/app/src/main/res/values-mr/strings.xml @@ -4,7 +4,7 @@ होम इंस्टॉल साठी क्लिक करा कार्यरत - आवृत्ती: %d + आवृत्ती: %s असमर्थित KernelSU आता फक्त GKI कर्नलचे समर्थन करते कर्नल diff --git a/manager/app/src/main/res/values-ms/strings.xml b/manager/app/src/main/res/values-ms/strings.xml index a2834bbd0b74..46e159945cf1 100644 --- a/manager/app/src/main/res/values-ms/strings.xml +++ b/manager/app/src/main/res/values-ms/strings.xml @@ -15,7 +15,7 @@ Tekan untuk memasang Modul Tentang - Versi: %d + Versi: %s Reboot KernelSU ketika ini hanya menyokong kernel GKI Status SELinux diff --git a/manager/app/src/main/res/values-nl/strings.xml b/manager/app/src/main/res/values-nl/strings.xml index 6797165e43dc..9901cf9578b4 100644 --- a/manager/app/src/main/res/values-nl/strings.xml +++ b/manager/app/src/main/res/values-nl/strings.xml @@ -4,7 +4,7 @@ Niet geïnstalleerd Tik om te installeren Werkend - Versie: %d + Versie: %s Niet ondersteund KernelSU ondersteunt momenteel alleen GKI-kernels, maar je kunt de image patchen voor GKI-apparaten. Kernel version diff --git a/manager/app/src/main/res/values-pl/strings.xml b/manager/app/src/main/res/values-pl/strings.xml index 955d25900674..ec1a386f1cef 100644 --- a/manager/app/src/main/res/values-pl/strings.xml +++ b/manager/app/src/main/res/values-pl/strings.xml @@ -5,7 +5,7 @@ Nie zainstalowano Kliknij, aby zainstalować Działa - Wersja: %d + Wersja: %s Nieobsługiwany KernelSU obsługuje obecnie tylko jądra GKI. Wersja jądra diff --git a/manager/app/src/main/res/values-pt-rBR/strings.xml b/manager/app/src/main/res/values-pt-rBR/strings.xml index f0d3b21f9829..9ee6b60678ed 100644 --- a/manager/app/src/main/res/values-pt-rBR/strings.xml +++ b/manager/app/src/main/res/values-pt-rBR/strings.xml @@ -4,7 +4,7 @@ Não instalado Clique para instalar Em execução - Versão: %d + Versão: %s Sem suporte KernelSU suporta apenas kernels GKI agora Versão do kernel diff --git a/manager/app/src/main/res/values-pt/strings.xml b/manager/app/src/main/res/values-pt/strings.xml index 8fe87b18415f..8aa8d39d34cb 100644 --- a/manager/app/src/main/res/values-pt/strings.xml +++ b/manager/app/src/main/res/values-pt/strings.xml @@ -4,7 +4,7 @@ Início Clique para instalar Funcionando - Versão: %d + Versão: %s Kernel Instalar Sem suporte diff --git a/manager/app/src/main/res/values-ro/strings.xml b/manager/app/src/main/res/values-ro/strings.xml index f0f0a1553078..08d4e4bf2637 100644 --- a/manager/app/src/main/res/values-ro/strings.xml +++ b/manager/app/src/main/res/values-ro/strings.xml @@ -4,7 +4,7 @@ Nu este instalat Click pentru a instala Funcționează - Versiune: %d + Versiune: %s Necompatibil KernelSU suportă doar nuclee GKI acum Nucleu diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml index 9d15cbf3cee7..f59b5f240d7d 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -4,7 +4,7 @@ Не установлен Нажмите, чтобы установить Работает - Версия: %d + Версия: %s Не поддерживается Теперь KernelSU поддерживает только ядра GKI, однако вы всё ещё можете пропатчить образ для GKI-устройств. diff --git a/manager/app/src/main/res/values-sl/strings.xml b/manager/app/src/main/res/values-sl/strings.xml index 12ed20d393be..627af6cc7a3d 100644 --- a/manager/app/src/main/res/values-sl/strings.xml +++ b/manager/app/src/main/res/values-sl/strings.xml @@ -2,7 +2,7 @@ Klikni za namestitev V obdelavi - Verzija: %d + Verzija: %s KernelSU podpira samo GKI kernele Kernel Verzija upravitelja diff --git a/manager/app/src/main/res/values-sr/strings.xml b/manager/app/src/main/res/values-sr/strings.xml index 05693945d20d..e0c9c1335425 100644 --- a/manager/app/src/main/res/values-sr/strings.xml +++ b/manager/app/src/main/res/values-sr/strings.xml @@ -3,7 +3,7 @@ Додирните да бисте инсталирали Почетна Није инсталирано - Верзија: %d + Верзија: %s Ради Сачувај Дневнике Preusmeri su binarni fajl diff --git a/manager/app/src/main/res/values-te/strings.xml b/manager/app/src/main/res/values-te/strings.xml index 515cb6257146..cc06fe6dcf79 100644 --- a/manager/app/src/main/res/values-te/strings.xml +++ b/manager/app/src/main/res/values-te/strings.xml @@ -14,7 +14,7 @@ ఇన్‌స్టాల్ చేయలేదు ఇన్‌స్టాల్ చేయడానికి క్లిక్ చేయండి పని చేస్తోంది - వెర్షన్: %d + వెర్షన్: %s లాగ్‌లు సేవ్ చేయండి su బైనరీని మళ్ళించండి యాప్ ప్రొఫైల్‌లో సూపర్‌యూజర్ అనుమతి ఉన్న యాప్‌ల కోసం /system/bin/su ని ksud కి మళ్ళించండి; కొత్త ప్రాసెస్‌లకు మాత్రమే పని చేస్తుంది. diff --git a/manager/app/src/main/res/values-th/strings.xml b/manager/app/src/main/res/values-th/strings.xml index 2231943a0aae..27488f98da80 100644 --- a/manager/app/src/main/res/values-th/strings.xml +++ b/manager/app/src/main/res/values-th/strings.xml @@ -4,7 +4,7 @@ ยังไม่ได้ติดตั้ง กดเพื่อติดตั้ง กำลังทำงาน - เวอร์ชัน: %d + เวอร์ชัน: %s เวอร์ชันตัวจัดการ ไม่รองรับ Enforcing diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml index 93860d457783..bca73e3db97b 100644 --- a/manager/app/src/main/res/values-tr/strings.xml +++ b/manager/app/src/main/res/values-tr/strings.xml @@ -5,7 +5,7 @@ Kurulmadı Yüklemek için dokunun Çalışıyor - Sürüm: %d + Sürüm: %s Desteklenmiyor KernelSU şimdilik sadece GKI çekirdeklerini destekliyor Çekirdek Versiyonu diff --git a/manager/app/src/main/res/values-uk/strings.xml b/manager/app/src/main/res/values-uk/strings.xml index 02c20b14a692..03c8e5300abc 100644 --- a/manager/app/src/main/res/values-uk/strings.xml +++ b/manager/app/src/main/res/values-uk/strings.xml @@ -4,7 +4,7 @@ Не встановлено Натисніть щоб встановити Працює - Версія: %d + Версія: %s Не підтримується KernelSU зараз підтримує лише ядра GKI. Версія ядра diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index 428452d8f4fa..1890a3691522 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -26,7 +26,7 @@ Chưa cài đặt Nhấn để cài đặt Đang hoạt động - Phiên bản: %d + Phiên bản: %s Không được hỗ trợ KernelSU hiện tại chỉ hỗ trợ Kernel GKI, nhưng bạn có thể patch file .img của thiết bị GKI mà bạn cần. Phiên bản Kernel diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml index 5f8ef5296c42..5e1a41746a0f 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -4,7 +4,7 @@ 未安装 点击安装 工作中 - 版本:%d + 版本:%s 不支持 KernelSU 现在只支持 GKI 内核,但是你可以为 GKI 设备补丁镜像。 管理器版本 (%1$d) 与 KernelSU 驱动版本 (%2$d) 不匹配。 @@ -83,6 +83,8 @@ SELinux 卸载模块 为 %s 更新 App Profile 失败 + 管理器 uapi 版本 (%1$d) 与 KernelSU 驱动 uapi 版本 (%2$d) 不匹配。 + 当前 KernelSU 管理器版本 %1$d 过低,KernelSU 无法正常工作. 请将 KernelSU 管理器版本升级至 %2$d 或以上! 当前 KernelSU 版本 %1$d 过低,管理器无法正常工作,请将内核 KernelSU 版本升级至 %2$d 或以上! 默认卸载模块 App Profile 中「卸载模块」的全局默认值,如果启用,会将未自定义 Profile 的应用移除所有模块针对系统的修改 diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml index 1091ec99c342..70dc0aa727fc 100644 --- a/manager/app/src/main/res/values-zh-rHK/strings.xml +++ b/manager/app/src/main/res/values-zh-rHK/strings.xml @@ -4,7 +4,7 @@ 未安裝 按一下開始安裝 運作中 - KernelSU 版本:%d + KernelSU 版本:%s 不支援 KernelSU 現僅支援 GKI 核心,但仍可修補 GKI 裝置映像。 裝置型號 diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml index a461dceaff68..d0764f22bda2 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -4,7 +4,7 @@ 尚未安裝 點選開始安裝 已開始運作 - 版本:%d + 版本:%s 未受支援 KernelSU 目前僅支援 GKI 核心 裝置型號 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 980265d8a1a5..8fff7af80895 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ Not installed Tap to install Working - Version: %d + Version: %s Unsupported KernelSU only supports GKI kernels now, but you can patch the image for GKI devices. Manager version (%1$d) and KernelSU driver version (%2$d) mismatch. @@ -104,6 +104,8 @@ SELinux context Umount modules Failed to update App Profile for %s + Manager uapi version (%1$d) and KernelSU driver uapi version (%2$d) mismatch. + The current KernelSU manager version %1$d is too low for KernelSU to work properly. Please upgrade manager to version %2$d or higher! The current KernelSU version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! Umount modules by default The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. diff --git a/uapi/supercall.h b/uapi/supercall.h index cae5da2fa821..5e5e8f78fb4b 100644 --- a/uapi/supercall.h +++ b/uapi/supercall.h @@ -6,6 +6,8 @@ #include "uapi/app_profile.h" +static const __u32 KERNEL_SU_UAPI_VERSION = 1; + /* Magic numbers for reboot hook to install fd */ static const __u32 KSU_INSTALL_MAGIC1 = 0xDEADBEEF; static const __u32 KSU_INSTALL_MAGIC2 = 0xCAFEBABE; @@ -27,6 +29,13 @@ struct ksu_get_info_cmd { __u32 version; /* Output: KERNEL_SU_VERSION */ __u32 flags; /* Output: KSU_GET_INFO_FLAG_* bits */ __u32 features; /* Output: max feature ID supported */ + __u32 uapi_version; /* Output: KERNEL_SU_UAPI_VERSION */ +}; + +struct ksu_get_info_legacy_cmd { + __u32 version; /* Output: KERNEL_SU_VERSION */ + __u32 flags; /* Output: KSU_GET_INFO_FLAG_* bits */ + __u32 features; /* Output: max feature ID supported */ }; struct ksu_report_event_cmd { @@ -140,7 +149,9 @@ static const __u8 KSU_UMOUNT_DEL = 2; /* delete entry, strcmp */ /* IOCTL command definitions */ static const __u32 KSU_IOCTL_GRANT_ROOT = _IOC(_IOC_NONE, 'K', 1, 0); -static const __u32 KSU_IOCTL_GET_INFO = _IOC(_IOC_READ, 'K', 2, 0); +static const __u32 KSU_IOCTL_GET_INFO = _IOR('K', 2, struct ksu_get_info_cmd); +/* deprecated */ +static const __u32 KSU_IOCTL_GET_INFO_LEGACY = _IOC(_IOC_READ, 'K', 2, 0); static const __u32 KSU_IOCTL_REPORT_EVENT = _IOC(_IOC_WRITE, 'K', 3, 0); static const __u32 KSU_IOCTL_SET_SEPOLICY = _IOC(_IOC_READ | _IOC_WRITE, 'K', 4, 0); static const __u32 KSU_IOCTL_CHECK_SAFEMODE = _IOC(_IOC_READ, 'K', 5, 0); diff --git a/userspace/ksud/src/cli.rs b/userspace/ksud/src/cli.rs index 26a01d2f2aca..a423158363c6 100644 --- a/userspace/ksud/src/cli.rs +++ b/userspace/ksud/src/cli.rs @@ -8,7 +8,8 @@ use log::{LevelFilter, error, info}; use crate::boot_patch::{BootPatchArgs, BootRestoreArgs}; use crate::module::regenerate_preinit_rc; use crate::{ - apk_sign, assets, debug, defs, init_event, ksucalls, module, module_config, sulog, utils, + apk_sign, assets, debug, defs, init_event, ksu_uapi, ksucalls, module, module_config, sulog, + utils, }; /// KernelSU userspace cli @@ -214,6 +215,9 @@ enum Debug { /// Launch sulogd daemon manually Sulogd, + + /// Get kernel info + Info, } #[derive(clap::Subcommand, Debug)] @@ -700,6 +704,26 @@ pub fn run() -> Result<()> { MarkCommand::Refresh => debug::mark_refresh(), }, Debug::Sulogd => sulog::ensure_sulogd_running(), + Debug::Info => { + let info = ksucalls::get_info(); + println!("version: {}", info.version); + println!("flags: 0x{:x}", info.flags); + println!("uapi_version: {}", info.uapi_version); + println!("features: 0x{:x}", info.features); + println!( + "lkm: {}", + (info.flags & ksu_uapi::KSU_GET_INFO_FLAG_LKM) != 0 + ); + println!( + "late_load: {}", + (info.flags & ksu_uapi::KSU_GET_INFO_FLAG_LATE_LOAD) != 0 + ); + println!( + "pr_build: {}", + (info.flags & ksu_uapi::KSU_GET_INFO_FLAG_PR_BUILD) != 0 + ); + Ok(()) + } }, Commands::BootPatch(boot_patch) => crate::boot_patch::patch(boot_patch), diff --git a/userspace/ksud/src/init_event.rs b/userspace/ksud/src/init_event.rs index d660a012a18f..f4f950cc57e6 100644 --- a/userspace/ksud/src/init_event.rs +++ b/userspace/ksud/src/init_event.rs @@ -6,7 +6,7 @@ use crate::{ }; use anyhow::{Context, Result}; use libc::_exit; -use log::{info, warn}; +use log::{error, info, warn}; use prop_rs_android::resetprop::ResetProp; use prop_rs_android::sys_prop; use rustix::process::chdir; @@ -14,6 +14,11 @@ use std::path::Path; use std::process::Command; pub fn on_post_data_fs() -> Result<()> { + if ksucalls::is_uapi_version_mismatch() { + error!("Kernel and userspace uapi version mismatch! skip on_post_fs_data"); + return Ok(()); + } + ksucalls::report_post_fs_data(); utils::umask(0); @@ -151,11 +156,21 @@ pub fn run_stage(stage: &str, block: bool) { } pub fn on_services() { + if ksucalls::is_uapi_version_mismatch() { + error!("Kernel and userspace uapi version mismatch! skip on_services"); + return; + } + info!("on_services triggered!"); run_stage("service", false); } pub fn on_boot_completed() { + if ksucalls::is_uapi_version_mismatch() { + error!("Kernel and userspace uapi version mismatch! skip on_boot_completed"); + return; + } + ksucalls::report_boot_complete(); info!("on_boot_completed triggered!"); @@ -230,6 +245,12 @@ fn catch_bootlog(logname: &str, command: &[&str]) -> Result<()> { } pub fn soft_reboot() -> Result<()> { + // check it avoid user click "soft_reboot" in manager when version mismatch + if ksucalls::is_uapi_version_mismatch() { + error!("Kernel and userspace uapi version mismatch! skip soft_reboot"); + return Ok(()); + } + utils::daemonize_with(true, || -> Result<()> { switch_mnt_ns(1)?; chdir("/")?; diff --git a/userspace/ksud/src/ksucalls.rs b/userspace/ksud/src/ksucalls.rs index b85b64b7fe48..d7ea52e03c54 100644 --- a/userspace/ksud/src/ksucalls.rs +++ b/userspace/ksud/src/ksucalls.rs @@ -62,14 +62,17 @@ fn ksuctl(request: u32, arg: *mut T) -> std::io::Result { } // API implementations -fn get_info() -> ksu_uapi::ksu_get_info_cmd { +pub fn get_info() -> ksu_uapi::ksu_get_info_cmd { *INFO_CACHE.get_or_init(|| { let mut cmd = ksu_uapi::ksu_get_info_cmd { version: 0, flags: 0, features: 0, + uapi_version: 0, }; - let _ = ksuctl(ksu_uapi::KSU_IOCTL_GET_INFO, &raw mut cmd); + if ksuctl(ksu_uapi::KSU_IOCTL_GET_INFO, &raw mut cmd).is_err() { + let _ = ksuctl(ksu_uapi::KSU_IOCTL_GET_INFO_LEGACY, &raw mut cmd); + } cmd }) } @@ -82,6 +85,10 @@ pub fn is_late_load() -> bool { get_info().flags & ksu_uapi::KSU_GET_INFO_FLAG_LATE_LOAD != 0 } +pub fn is_uapi_version_mismatch() -> bool { + get_info().uapi_version != ksu_uapi::KERNEL_SU_UAPI_VERSION +} + pub fn grant_root() -> std::io::Result<()> { ksuctl(ksu_uapi::KSU_IOCTL_GRANT_ROOT, std::ptr::null_mut::())?; Ok(()) diff --git a/userspace/ksuinit/src/lib.rs b/userspace/ksuinit/src/lib.rs index a90990739f14..058db33828f4 100644 --- a/userspace/ksuinit/src/lib.rs +++ b/userspace/ksuinit/src/lib.rs @@ -150,7 +150,8 @@ fn has_kernelsu_v2() -> bool { use syscalls::{Sysno, syscall}; const KSU_INSTALL_MAGIC1: u32 = 0xDEADBEEF; const KSU_INSTALL_MAGIC2: u32 = 0xCAFEBABE; - const KSU_IOCTL_GET_INFO: u32 = 0x80004b02; // _IOC(_IOC_READ, 'K', 2, 0) + const KSU_IOCTL_GET_INFO: u32 = 0x80104b02; // _IOR('K', 2, struct ksu_get_info_cmd) + const KSU_IOCTL_GET_INFO_LEGACY: u32 = 0x80004b02; // _IOC(_IOC_READ, 'K', 2, 0) #[repr(C)] #[derive(Default)] @@ -158,6 +159,15 @@ fn has_kernelsu_v2() -> bool { version: u32, flags: u32, features: u32, + uapi_version: u32, + } + + #[repr(C)] + #[derive(Default)] + struct GetInfoLegacyCmd { + version: u32, + flags: u32, + features: u32, } // Try new method: get driver fd using reboot syscall with magic numbers @@ -180,7 +190,18 @@ fn has_kernelsu_v2() -> bool { match ret { Ok(_) => cmd.version, - Err(_) => 0, + Err(_) => { + let mut cmd = GetInfoLegacyCmd::default(); + match syscall!( + Sysno::ioctl, + fd, + KSU_IOCTL_GET_INFO_LEGACY, + &mut cmd as *mut _ + ) { + Ok(_) => cmd.version, + Err(_) => 0, + } + } } };