diff --git a/kernel/kernel_umount.c b/kernel/kernel_umount.c index 9bd8ec57..40860570 100644 --- a/kernel/kernel_umount.c +++ b/kernel/kernel_umount.c @@ -43,24 +43,6 @@ static const struct ksu_feature_handler kernel_umount_handler = { .set_handler = kernel_umount_feature_set, }; -static bool should_umount(struct path *path) -{ - if (!path) { - return false; - } - - if (current->nsproxy->mnt_ns == init_nsproxy.mnt_ns) { - pr_info("ignore global mnt namespace process: %d\n", current_uid().val); - return false; - } - - if (path->mnt && path->mnt->mnt_sb && path->mnt->mnt_sb->s_type) { - const char *fstype = path->mnt->mnt_sb->s_type->name; - return strcmp(fstype, "overlay") == 0; - } - return false; -} - extern int path_umount(struct path *path, int flags); static void ksu_umount_mnt(struct path *path, int flags) @@ -71,7 +53,7 @@ static void ksu_umount_mnt(struct path *path, int flags) } } -void try_umount(const char *mnt, bool check_mnt, int flags) +void try_umount(const char *mnt, int flags) { struct path path; int err = kern_path(mnt, 0, &path); @@ -85,12 +67,6 @@ void try_umount(const char *mnt, bool check_mnt, int flags) return; } - // we are only interest in some specific mounts - if (check_mnt && !should_umount(&path)) { - path_put(&path); - return; - } - ksu_umount_mnt(&path, flags); } @@ -107,8 +83,14 @@ static void umount_tw_func(struct callback_head *cb) saved = override_creds(tw->old_cred); } - // fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and - // filter the mountpoint whose target is `/data/adb` + struct mount_entry *entry; + down_read(&mount_list_lock); + list_for_each_entry(entry, &mount_list, list) { + pr_info("%s: unmounting: %s flags 0x%x\n", __func__, entry->umountable, entry->flags); + try_umount(entry->umountable, entry->flags); + } + up_read(&mount_list_lock); + ksu_umount_manager_execute_all(tw->old_cred); if (saved) diff --git a/kernel/kernel_umount.h b/kernel/kernel_umount.h index 68d2f759..65da6203 100644 --- a/kernel/kernel_umount.h +++ b/kernel/kernel_umount.h @@ -2,13 +2,24 @@ #define __KSU_H_KERNEL_UMOUNT #include +#include +#include void ksu_kernel_umount_init(void); void ksu_kernel_umount_exit(void); -void try_umount(const char *mnt, bool check_mnt, int flags); +void try_umount(const char *mnt, int flags); // Handler function to be called from setresuid hook int ksu_handle_umount(uid_t old_uid, uid_t new_uid); -#endif \ No newline at end of file +// for the umount list +struct mount_entry { + char *umountable; + unsigned int flags; + struct list_head list; +}; +extern struct list_head mount_list; +extern struct rw_semaphore mount_list_lock; + +#endif diff --git a/kernel/supercalls.c b/kernel/supercalls.c index 85349f96..e42007f0 100644 --- a/kernel/supercalls.c +++ b/kernel/supercalls.c @@ -18,6 +18,7 @@ #include "feature.h" #include "klog.h" // IWYU pragma: keep #include "ksud.h" +#include "kernel_umount.h" #include "manager.h" #include "selinux/selinux.h" #include "objsec.h" @@ -510,6 +511,111 @@ static int do_nuke_ext4_sysfs(void __user *arg) return nuke_ext4_sysfs(mnt); } +struct list_head mount_list = LIST_HEAD_INIT(mount_list); +DECLARE_RWSEM(mount_list_lock); + +static int add_try_umount(void __user *arg) +{ + struct mount_entry *new_entry, *entry, *tmp; + struct ksu_add_try_umount_cmd cmd; + char buf[256] = {0}; + + if (copy_from_user(&cmd, arg, sizeof cmd)) + return -EFAULT; + + switch (cmd.mode) { + case KSU_UMOUNT_WIPE: { + struct mount_entry *entry, *tmp; + down_write(&mount_list_lock); + list_for_each_entry_safe(entry, tmp, &mount_list, list) { + pr_info("wipe_umount_list: removing entry: %s\n", entry->umountable); + list_del(&entry->list); + kfree(entry->umountable); + kfree(entry); + } + up_write(&mount_list_lock); + + return 0; + } + + case KSU_UMOUNT_ADD: { + long len = strncpy_from_user(buf, (const char __user *)cmd.arg, 256); + if (len <= 0) + return -EFAULT; + + buf[sizeof(buf) - 1] = '\0'; + + new_entry = kzalloc(sizeof(*new_entry), GFP_KERNEL); + if (!new_entry) + return -ENOMEM; + + new_entry->umountable = kstrdup(buf, GFP_KERNEL); + if (!new_entry->umountable) { + kfree(new_entry); + return -1; + } + + down_write(&mount_list_lock); + + // disallow dupes + // if this gets too many, we can consider moving this whole task to a kthread + list_for_each_entry(entry, &mount_list, list) { + if (!strcmp(entry->umountable, buf)) { + pr_info("cmd_add_try_umount: %s is already here!\n", buf); + up_write(&mount_list_lock); + kfree(new_entry->umountable); + kfree(new_entry); + return -1; + } + } + + // now check flags and add + // this also serves as a null check + if (cmd.flags) + new_entry->flags = cmd.flags; + else + new_entry->flags = 0; + + // debug + list_add(&new_entry->list, &mount_list); + up_write(&mount_list_lock); + pr_info("cmd_add_try_umount: %s added!\n", buf); + + return 0; + } + + // this is just strcmp'd wipe anyway + case KSU_UMOUNT_DEL: { + long len = strncpy_from_user(buf, (const char __user *)cmd.arg, sizeof(buf) - 1); + if (len <= 0) + return -EFAULT; + + buf[sizeof(buf) - 1] = '\0'; + + down_write(&mount_list_lock); + list_for_each_entry_safe(entry, tmp, &mount_list, list) { + if (!strcmp(entry->umountable, buf)) { + pr_info("cmd_add_try_umount: entry removed: %s\n", entry->umountable); + list_del(&entry->list); + kfree(entry->umountable); + kfree(entry); + } + } + up_write(&mount_list_lock); + + return 0; + } + + default: { + pr_err("cmd_add_try_umount: invalid operation %u\n", cmd.mode); + return -EINVAL; + } + + } // switch(cmd.mode) + + return 0; +} + // 100. GET_FULL_VERSION - Get full version string static int do_get_full_version(void __user *arg) { @@ -721,7 +827,7 @@ static int do_umount_manager(void __user *arg) switch (cmd.operation) { case UMOUNT_OP_ADD: { - return ksu_umount_manager_add(cmd.path, cmd.check_mnt, cmd.flags, false); + return ksu_umount_manager_add(cmd.path, cmd.flags, false); } case UMOUNT_OP_REMOVE: { return ksu_umount_manager_remove(cmd.path); @@ -758,6 +864,7 @@ static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = { { .cmd = KSU_IOCTL_GET_WRAPPER_FD, .name = "GET_WRAPPER_FD", .handler = do_get_wrapper_fd, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_MANAGE_MARK, .name = "MANAGE_MARK", .handler = do_manage_mark, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_NUKE_EXT4_SYSFS, .name = "NUKE_EXT4_SYSFS", .handler = do_nuke_ext4_sysfs, .perm_check = manager_or_root }, + { .cmd = KSU_IOCTL_ADD_TRY_UMOUNT, .name = "ADD_TRY_UMOUNT", .handler = add_try_umount, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_GET_FULL_VERSION,.name = "GET_FULL_VERSION", .handler = do_get_full_version, .perm_check = always_allow}, { .cmd = KSU_IOCTL_HOOK_TYPE,.name = "GET_HOOK_TYPE", .handler = do_get_hook_type, .perm_check = manager_or_root}, { .cmd = KSU_IOCTL_ENABLE_KPM, .name = "GET_ENABLE_KPM", .handler = do_enable_kpm, .perm_check = manager_or_root}, diff --git a/kernel/supercalls.h b/kernel/supercalls.h index c4f95e19..6caca808 100644 --- a/kernel/supercalls.h +++ b/kernel/supercalls.h @@ -89,15 +89,26 @@ struct ksu_manage_mark_cmd { __u32 result; // Output: for get operation - mark status or reg_count }; -struct ksu_nuke_ext4_sysfs_cmd { - __aligned_u64 arg; // Input: mnt pointer -}; - #define KSU_MARK_GET 1 #define KSU_MARK_MARK 2 #define KSU_MARK_UNMARK 3 #define KSU_MARK_REFRESH 4 +struct ksu_nuke_ext4_sysfs_cmd { + __aligned_u64 arg; // Input: mnt pointer +}; + +struct ksu_add_try_umount_cmd { + __aligned_u64 arg; // char ptr, this is the mountpoint + __u32 flags; // this is the flag we use for it + __u8 mode; // denotes what to do with it 0:wipe_list 1:add_to_list 2:delete_entry +}; + +#define KSU_UMOUNT_WIPE 0 // ignore everything and wipe list +#define KSU_UMOUNT_ADD 1 // add entry (path + flags) +#define KSU_UMOUNT_DEL 2 // delete entry, strcmp + + // Other command structures struct ksu_get_full_version_cmd { char version_full[KSU_FULL_VERSION_STRING]; // Output: full version string @@ -152,6 +163,7 @@ struct ksu_manual_su_cmd { #define KSU_IOCTL_GET_WRAPPER_FD _IOC(_IOC_WRITE, 'K', 15, 0) #define KSU_IOCTL_MANAGE_MARK _IOC(_IOC_READ|_IOC_WRITE, 'K', 16, 0) #define KSU_IOCTL_NUKE_EXT4_SYSFS _IOC(_IOC_WRITE, 'K', 17, 0) +#define KSU_IOCTL_ADD_TRY_UMOUNT _IOC(_IOC_WRITE, 'K', 18, 0) // Other IOCTL command definitions #define KSU_IOCTL_GET_FULL_VERSION _IOC(_IOC_READ, 'K', 100, 0) #define KSU_IOCTL_HOOK_TYPE _IOC(_IOC_READ, 'K', 101, 0) diff --git a/kernel/umount_manager.c b/kernel/umount_manager.c index 5d1e6039..b901a19b 100644 --- a/kernel/umount_manager.c +++ b/kernel/umount_manager.c @@ -17,7 +17,7 @@ static struct umount_manager g_umount_mgr = { static void try_umount_path(struct umount_entry *entry) { - try_umount(entry->path, entry->check_mnt, entry->flags); + try_umount(entry->path, entry->flags); } static struct umount_entry *find_entry_locked(const char *path) @@ -39,21 +39,19 @@ static int init_default_entries(void) const struct { const char *path; - bool check_mnt; int flags; } defaults[] = { - { "/odm", true, 0 }, - { "/system", true, 0 }, - { "/vendor", true, 0 }, - { "/product", true, 0 }, - { "/system_ext", true, 0 }, - { "/data/adb/modules", false, MNT_DETACH }, - { "/debug_ramdisk", false, MNT_DETACH }, + { "/odm", 0 }, + { "/system", 0 }, + { "/vendor", 0 }, + { "/product", 0 }, + { "/system_ext", 0 }, + { "/data/adb/modules", MNT_DETACH }, + { "/debug_ramdisk", MNT_DETACH }, }; for (int i = 0; i < ARRAY_SIZE(defaults); i++) { - ret = ksu_umount_manager_add(defaults[i].path, - defaults[i].check_mnt, + ret = ksu_umount_manager_add(defaults[i].path, defaults[i].flags, true); // is_default = true if (ret) { @@ -93,7 +91,7 @@ void ksu_umount_manager_exit(void) pr_info("Umount manager cleaned up\n"); } -int ksu_umount_manager_add(const char *path, bool check_mnt, int flags, bool is_default) +int ksu_umount_manager_add(const char *path, int flags, bool is_default) { struct umount_entry *entry; unsigned long irqflags; @@ -127,7 +125,6 @@ int ksu_umount_manager_add(const char *path, bool check_mnt, int flags, bool is_ } strncpy(entry->path, path, sizeof(entry->path) - 1); - entry->check_mnt = check_mnt; entry->flags = flags; entry->state = UMOUNT_STATE_IDLE; entry->is_default = is_default; @@ -234,7 +231,6 @@ int ksu_umount_manager_get_entries(struct ksu_umount_entry_info __user *entries, memset(&info, 0, sizeof(info)); strncpy(info.path, entry->path, sizeof(info.path) - 1); - info.check_mnt = entry->check_mnt; info.flags = entry->flags; info.is_default = entry->is_default; info.state = entry->state; diff --git a/kernel/umount_manager.h b/kernel/umount_manager.h index f0299b40..41c9888c 100644 --- a/kernel/umount_manager.h +++ b/kernel/umount_manager.h @@ -16,7 +16,6 @@ enum umount_entry_state { struct umount_entry { struct list_head list; char path[256]; - bool check_mnt; int flags; enum umount_entry_state state; bool is_default; @@ -40,7 +39,6 @@ enum umount_manager_op { struct ksu_umount_manager_cmd { __u32 operation; char path[256]; - __u8 check_mnt; __s32 flags; __u32 count; __aligned_u64 entries_ptr; @@ -48,7 +46,6 @@ struct ksu_umount_manager_cmd { struct ksu_umount_entry_info { char path[256]; - __u8 check_mnt; __s32 flags; __u8 is_default; __u32 state; @@ -57,7 +54,7 @@ struct ksu_umount_entry_info { int ksu_umount_manager_init(void); void ksu_umount_manager_exit(void); -int ksu_umount_manager_add(const char *path, bool check_mnt, int flags, bool is_default); +int ksu_umount_manager_add(const char *path, int flags, bool is_default); int ksu_umount_manager_remove(const char *path); void ksu_umount_manager_execute_all(const struct cred *cred); int ksu_umount_manager_get_entries(struct ksu_umount_entry_info __user *entries, u32 *count); diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt index 2e27203d..0e2206e3 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt @@ -38,7 +38,6 @@ private val SPACING_LARGE = 16.dp data class UmountPathEntry( val path: String, - val checkMnt: Boolean, val flags: Int, val isDefault: Boolean ) @@ -244,11 +243,11 @@ fun UmountManagerScreen(navigator: DestinationsNavigator) { if (showAddDialog) { AddUmountPathDialog( onDismiss = { showAddDialog = false }, - onConfirm = { path, checkMnt, flags -> + onConfirm = { path, flags -> showAddDialog = false scope.launch(Dispatchers.IO) { - val success = addUmountPath(path, checkMnt, flags) + val success = addUmountPath(path, flags) withContext(Dispatchers.Main) { if (success) { saveUmountConfig() @@ -309,10 +308,6 @@ fun UmountPathCard( Spacer(modifier = Modifier.height(SPACING_SMALL)) Text( text = buildString { - append(context.getString(R.string.check_mount_type)) - append(": ") - append(if (entry.checkMnt) context.getString(R.string.yes) else context.getString(R.string.no)) - append(" | ") append(context.getString(R.string.flags)) append(": ") append(entry.flags.toUmountFlagName(context)) @@ -353,10 +348,9 @@ fun UmountPathCard( @Composable fun AddUmountPathDialog( onDismiss: () -> Unit, - onConfirm: (String, Boolean, Int) -> Unit + onConfirm: (String, Int) -> Unit ) { var path by rememberSaveable { mutableStateOf("") } - var checkMnt by rememberSaveable { mutableStateOf(false) } var flags by rememberSaveable { mutableStateOf("-1") } AlertDialog( @@ -374,20 +368,6 @@ fun AddUmountPathDialog( Spacer(modifier = Modifier.height(SPACING_MEDIUM)) - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically - ) { - Checkbox( - checked = checkMnt, - onCheckedChange = { checkMnt = it } - ) - Spacer(modifier = Modifier.width(SPACING_SMALL)) - Text(stringResource(R.string.check_mount_type_overlay)) - } - - Spacer(modifier = Modifier.height(SPACING_MEDIUM)) - OutlinedTextField( value = flags, onValueChange = { flags = it }, @@ -403,7 +383,7 @@ fun AddUmountPathDialog( TextButton( onClick = { val flagsInt = flags.toIntOrNull() ?: -1 - onConfirm(path, checkMnt, flagsInt) + onConfirm(path, flagsInt) }, enabled = path.isNotBlank() ) { @@ -424,12 +404,11 @@ private fun parseUmountPaths(output: String): List { return lines.drop(2).mapNotNull { line -> val parts = line.trim().split(Regex("\\s+")) - if (parts.size >= 4) { + if (parts.size >= 3) { UmountPathEntry( path = parts[0], - checkMnt = parts[1].equals("true", ignoreCase = true), - flags = parts[2].toIntOrNull() ?: -1, - isDefault = parts[3].equals("Yes", ignoreCase = true) + flags = parts[1].toIntOrNull() ?: -1, + isDefault = parts[2].equals("Yes", ignoreCase = true) ) } else null } diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt index a8fcfc51..36dc4e52 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt @@ -13,7 +13,6 @@ import android.util.Log import com.topjohnwu.superuser.CallbackList import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils -import com.topjohnwu.superuser.io.SuFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize @@ -22,7 +21,6 @@ import com.sukisu.ultra.Natives import com.sukisu.ultra.ksuApp import org.json.JSONArray import java.io.File -import java.util.concurrent.CountDownLatch /** @@ -676,15 +674,14 @@ fun readUidScannerFile(): Boolean { return try { ShellUtils.fastCmd(shell, "cat /data/adb/ksu/.uid_scanner").trim() == "1" } catch (_: Exception) { - false + false } } -fun addUmountPath(path: String, checkMnt: Boolean, flags: Int): Boolean { +fun addUmountPath(path: String, flags: Int): Boolean { val shell = getRootShell() - val checkMntFlag = if (checkMnt) "--check-mnt" else "" val flagsArg = if (flags >= 0) "--flags $flags" else "" - val cmd = "${getKsuDaemonPath()} umount add $path $checkMntFlag $flagsArg" + val cmd = "${getKsuDaemonPath()} umount add $path $flagsArg" val result = ShellUtils.fastCmdResult(shell, cmd) Log.i(TAG, "add umount path $path result: $result") return result diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml index f1e2a35a..542a2566 100644 --- a/manager/app/src/main/res/values-ar/strings.xml +++ b/manager/app/src/main/res/values-ar/strings.xml @@ -126,7 +126,6 @@ LKM المحددة: %s حفظ السجلات السجلات محفوظة - وضع SuS SU تأكيد وحدة التثبيت %1$s؟ وحدة غير معروفة @@ -276,8 +275,6 @@ إعدادات متقدمة تخصيص شريط الأدوات عد مرة أخرى - تم تمكين SuSFS - تم تعطيل SuSFS تم تعيين الخلفية بنجاح إزالة خلفيات مخصصة Alternate icon diff --git a/manager/app/src/main/res/values-az/strings.xml b/manager/app/src/main/res/values-az/strings.xml index 32086b2b..d90028db 100644 --- a/manager/app/src/main/res/values-az/strings.xml +++ b/manager/app/src/main/res/values-az/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Girişləri Saxla Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-bs/strings.xml b/manager/app/src/main/res/values-bs/strings.xml index 4477a43d..da5e8299 100644 --- a/manager/app/src/main/res/values-bs/strings.xml +++ b/manager/app/src/main/res/values-bs/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Sačuvaj Dnevnike Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-da/strings.xml b/manager/app/src/main/res/values-da/strings.xml index 1c26353c..3c3221a5 100644 --- a/manager/app/src/main/res/values-da/strings.xml +++ b/manager/app/src/main/res/values-da/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Gem Logfiler Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-de/strings.xml b/manager/app/src/main/res/values-de/strings.xml index e149a4f5..b9d848a4 100644 --- a/manager/app/src/main/res/values-de/strings.xml +++ b/manager/app/src/main/res/values-de/strings.xml @@ -126,7 +126,6 @@ Wähle LKM: %s Protokolle Speichern Protokolle gespeichert - SuS SU-Modus: das Installationsmodul %1$s bestätigen ? unbekannter Modul @@ -276,8 +275,6 @@ Erweiterte Einstellungen Passt die Symbolleiste an. Comeback - SuSFS aktiviert - SuSFS deaktiviert Hintergrund erfolgreich gesetzt Eigene Hintergründe entfernt Alternatives Symbol diff --git a/manager/app/src/main/res/values-es/strings.xml b/manager/app/src/main/res/values-es/strings.xml index 1593c6b0..451ee778 100644 --- a/manager/app/src/main/res/values-es/strings.xml +++ b/manager/app/src/main/res/values-es/strings.xml @@ -124,7 +124,6 @@ LKM seleccionado: %s Guardar registros Registro guardado - Modo SuS SU: ¿confirmar la instalación del módulo %1$s? módulo desconocido @@ -274,8 +273,6 @@ Configuraciones avanzadas Personalizar la barra de herramientas. Retorno - SuSFS activado - SuSFS desactivado Fondo establecido correctamente Eliminar fondo personalizado Icono alternativo diff --git a/manager/app/src/main/res/values-et/strings.xml b/manager/app/src/main/res/values-et/strings.xml index 3296faca..7c8640aa 100644 --- a/manager/app/src/main/res/values-et/strings.xml +++ b/manager/app/src/main/res/values-et/strings.xml @@ -124,7 +124,6 @@ Valitud LKM: %s Salvesta Logid Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-fa/strings.xml b/manager/app/src/main/res/values-fa/strings.xml index bff34861..e142416b 100644 --- a/manager/app/src/main/res/values-fa/strings.xml +++ b/manager/app/src/main/res/values-fa/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s ذخیره گزارش‌ها Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-fil/strings.xml b/manager/app/src/main/res/values-fil/strings.xml index 9df07b43..afcc0b2a 100644 --- a/manager/app/src/main/res/values-fil/strings.xml +++ b/manager/app/src/main/res/values-fil/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s I-save ang mga Log Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml index a0f027bf..6d465159 100644 --- a/manager/app/src/main/res/values-fr/strings.xml +++ b/manager/app/src/main/res/values-fr/strings.xml @@ -126,7 +126,6 @@ LKM sélectionné : %s Enregistrer les journaux Journaux enregistrés - Mode Sus confirmer l\'installation du module %1$s? module inconnu @@ -276,8 +275,6 @@ Paramètres avancés Choisir les boutons à afficher Reviens - SuSFS activé - SuSFS désactivé Fond d\'écran défini avec succès Fond d\'écran personnalisé supprimé Icône alternative diff --git a/manager/app/src/main/res/values-hi/strings.xml b/manager/app/src/main/res/values-hi/strings.xml index e07439b9..cde029c2 100644 --- a/manager/app/src/main/res/values-hi/strings.xml +++ b/manager/app/src/main/res/values-hi/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s लॉग सहेजें Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-hr/strings.xml b/manager/app/src/main/res/values-hr/strings.xml index 1700ada9..ab688415 100644 --- a/manager/app/src/main/res/values-hr/strings.xml +++ b/manager/app/src/main/res/values-hr/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Spremi Zapise Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-hu/strings.xml b/manager/app/src/main/res/values-hu/strings.xml index 21a465a4..ba3813a0 100644 --- a/manager/app/src/main/res/values-hu/strings.xml +++ b/manager/app/src/main/res/values-hu/strings.xml @@ -124,7 +124,6 @@ Kiválasztott LKM: %s Naplók mentése Mentett naplók - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-idn/strings.xml b/manager/app/src/main/res/values-idn/strings.xml index 6c9a5eef..3dbe03ec 100644 --- a/manager/app/src/main/res/values-idn/strings.xml +++ b/manager/app/src/main/res/values-idn/strings.xml @@ -113,7 +113,6 @@ Gunakan opsi ini hanya setelah OTA selesai. Lanjutkan? Lanjut Disarankan gambar partisi %1$s - (tidak stabil) Pilih KMI Copot Pemasangan Copot Pemasangan Sementara @@ -128,7 +127,6 @@ Lanjutkan? LKM Terpilih: %s Simpan Log Log Disimpan - Mode SuS SU: Konfirmasi pemasangan modul %1$s? modul tidak dikenal @@ -283,8 +281,6 @@ Tanamkan: Secara permanen memasang ke sistem Pengaturan Lanjutan Sesuaikan Bilah Alat Kembali - SuSFS diaktifkan - SuSFS dinonaktifkan Latar belakang berhasil diatur Latar belakang khusus dihapus Ikon Alternatif diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml index d4ba145c..64027ac4 100644 --- a/manager/app/src/main/res/values-in/strings.xml +++ b/manager/app/src/main/res/values-in/strings.xml @@ -114,7 +114,6 @@ Gunakan berkas LKM lokal Hanya berkas .ko yang didukung %1$s image partisi terekomendasi - (tidak stabil) Pilih KMI Hapus Hapus sementara @@ -129,7 +128,6 @@ LKM dipilih: %s Simpan Log Log disimpan - Mode SuS SU: konfirmasi pemasangan modul %1$s? module tidak dikenal @@ -290,8 +288,6 @@ Pengaturan Lanjutan Kustomisasi toolbar Kembali - SuSFS dinyalakan - SuSFS dimatikan Set latar belakang berhasil Latar belakang khusus yang dihapus Ubah ikon @@ -608,7 +604,6 @@ Jalur Loop Tambahkan Jalur Loop - Jalur Loop SUS Konfigurasi Jalur Loop Jalur loop ditandai ulang sebagai SUS_PATH pada setiap startup aplikasi pengguna non-root atau layanan terisolasi. Ini membantu mengatasi masalah di mana jalur yang ditambahkan mungkin memiliki status inode direset atau inode dibuat ulang di kernel. Palsukan log AVC @@ -662,7 +657,6 @@ Diaktifkan: Aktifkan pemalsuan sus tcontext dari \'su\' dengan \'kernel\' yang d Pemindaian Aplikasi Multi-Pengguna Ketika diaktifkan, fitur ini akan memindai aplikasi untuk semua pengguna, termasuk profil kerja Gagal mengatur, silakan periksa perizinan - Gagal mengatur: %s Bersihkan Lingkungan Runtime Bersihkan berkas runtime dan hentikan layanan pemindai Apakah Anda yakin ingin membersihkan lingkungan runtime? Tindakan ini akan menghentikan layanan pemindai dan menghapus berkas yang terkait. diff --git a/manager/app/src/main/res/values-it/strings.xml b/manager/app/src/main/res/values-it/strings.xml index c664395c..a33f66cb 100644 --- a/manager/app/src/main/res/values-it/strings.xml +++ b/manager/app/src/main/res/values-it/strings.xml @@ -126,7 +126,6 @@ LKM selezionato: %s Salva Registri Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -276,8 +275,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index ff9e96ec..fdbfa061 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -112,7 +112,6 @@ \n続行しますか? 次へ %1$s のパーティションイメージを推奨します。 - (不安定) KMI を選択してください アンインストール 一時的にアンインストールする @@ -127,7 +126,6 @@ 選択された LKM: %s ログを保存 保存されたログ - SuS SU モード: %1$s モジュールをインストールしますか? 不明なモジュール @@ -281,8 +279,6 @@ 高度な設定 ツールバーをカスタマイズ 戻る - SuSFS 有効 - SuSFS 無効 背景の設定が成功しました カスタム背景を削除しました 代替アイコン @@ -597,7 +593,6 @@ ループパス ループパスを追加 - SUS ループパス ループパスの構成 ループパスは、非 root ユーザーアプリまたは独立したサービスの起動ごとに SUS_PATH として再設定されます。これにより、追加されたパスの inode ステータスがリセットされたり、カーネル内で inode が再生成される問題に対処できます。 AVC ログの偽装 diff --git a/manager/app/src/main/res/values-kn/strings.xml b/manager/app/src/main/res/values-kn/strings.xml index b0e75f19..e60127c6 100644 --- a/manager/app/src/main/res/values-kn/strings.xml +++ b/manager/app/src/main/res/values-kn/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s ಲಾಗ್ಗಳನ್ನು ಉಳಿಸಿ Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ko/strings.xml b/manager/app/src/main/res/values-ko/strings.xml index 387a14f8..8e6ee7de 100644 --- a/manager/app/src/main/res/values-ko/strings.xml +++ b/manager/app/src/main/res/values-ko/strings.xml @@ -124,7 +124,6 @@ 선택된 LKM: %s 로그 저장 로그 저장됨 - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-lt/strings.xml b/manager/app/src/main/res/values-lt/strings.xml index 4b9c8b4a..4206c33f 100644 --- a/manager/app/src/main/res/values-lt/strings.xml +++ b/manager/app/src/main/res/values-lt/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Saglabāt Žurnālus Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-lv/strings.xml b/manager/app/src/main/res/values-lv/strings.xml index 4bdb803a..92b82876 100644 --- a/manager/app/src/main/res/values-lv/strings.xml +++ b/manager/app/src/main/res/values-lv/strings.xml @@ -126,7 +126,6 @@ Izvēlētais lkm: %s Išsaugoti Žurnalus Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -276,8 +275,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-mr/strings.xml b/manager/app/src/main/res/values-mr/strings.xml index 9f455df9..d070c17d 100644 --- a/manager/app/src/main/res/values-mr/strings.xml +++ b/manager/app/src/main/res/values-mr/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s लॉग जतन करा Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ms/strings.xml b/manager/app/src/main/res/values-ms/strings.xml index ae3faf73..245e8b57 100644 --- a/manager/app/src/main/res/values-ms/strings.xml +++ b/manager/app/src/main/res/values-ms/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Simpan Log Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-nl/strings.xml b/manager/app/src/main/res/values-nl/strings.xml index 5932c21c..3e516f12 100644 --- a/manager/app/src/main/res/values-nl/strings.xml +++ b/manager/app/src/main/res/values-nl/strings.xml @@ -126,7 +126,6 @@ Geselecteerde LKM: %s Logboeken Opslaan Logs opgeslagen - SuS SU mode: confirm install module %1$s? unknown module @@ -276,8 +275,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-pl/strings.xml b/manager/app/src/main/res/values-pl/strings.xml index 6a5f99bb..3a2203ae 100644 --- a/manager/app/src/main/res/values-pl/strings.xml +++ b/manager/app/src/main/res/values-pl/strings.xml @@ -126,7 +126,6 @@ Wybrano LKM: %s Zapisz dzienniki Dzienniki zapisane - SuS SU mode: confirm install module %1$s? unknown module @@ -276,8 +275,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-pt/strings.xml b/manager/app/src/main/res/values-pt/strings.xml index 8791bebc..cda81c7a 100644 --- a/manager/app/src/main/res/values-pt/strings.xml +++ b/manager/app/src/main/res/values-pt/strings.xml @@ -124,7 +124,6 @@ LKM selecionado: %s Salvar Registros Registros salvos - Modo SU SuSU: ¿confirmar la instalación del módulo %1$s? módulo desconocido @@ -274,8 +273,6 @@ Configurações Avançadas Personaliza a barra de ferramentas. Retorno - SuSFS habilitado - SuSFS desativado Fundo definido com sucesso Remover Ícone alternativo diff --git a/manager/app/src/main/res/values-ro/strings.xml b/manager/app/src/main/res/values-ro/strings.xml index f7685065..10d9095b 100644 --- a/manager/app/src/main/res/values-ro/strings.xml +++ b/manager/app/src/main/res/values-ro/strings.xml @@ -126,7 +126,6 @@ Lkm selectat: %s Salvează Jurnale Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -276,8 +275,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml index 685a5c74..1c6aedec 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -115,7 +115,6 @@ Использовать локальный файл LKM Поддерживаются только файлы .ko Образ раздела %1$s рекомендуется - (нестабильный) Выбрать KMI Удалить Удалить на время @@ -130,7 +129,6 @@ Выбран LKM: %s Сохранить логи Логи сохранены - SuS SU режим: подтвердите установку модуля %1$s? неизвестный модуль @@ -291,8 +289,6 @@ Расширенные Внешний вид Возвращение - SuSFS включен - SuSFS выключен Фон успешно установлен Пользовательский фон удалён Альт. иконка @@ -609,7 +605,6 @@ Циклические пути Добавить циклический путь - Циклический путь SUS Конфигурация пути цикла Пути цикла повторно отмечены как SUS_PATH в каждом пользовательском приложении, не являющемся root, или изолированном запуске службы. Это помогает решить проблемы, в которых добавленные пути могут иметь сброс статуса inode или повторно созданные inode в ядре. Спуф AVC лога @@ -662,7 +657,6 @@ Поиск многопользовательских приложений Когда включено, сканирует приложения для всех пользователей, включая рабочие профили Не удалось установить, проверьте права доступа - Не удалось установить: %s Очистить среду Runtime Очистить среду Runtime и остановить службу сканирования Вы уверены, что хотите очистить среду Runtime? Это остановит службу сканирования и удалит связанные с ней файлы. @@ -705,9 +699,6 @@ Очистить логи Вы уверены, что хотите удалить выбранный файл журнала? Это действие нельзя отменить. Логи успешно очищены - Выберите файл журнала - Текущий лог - Старый лог Фильтрация по типу Все типы Показаны записи %1$d из %2$d @@ -735,8 +726,6 @@ Для применения изменений необходима перезагрузка. Система применит новый конфиг при следующем запуске. Добавить путь размонтирования Смонтировать путь - Проверить тип монтирования - Проверить, является ли оверлеем Флаги размонтирования 0=Обычное размонтирование, 8=MNT_DETACH, -1=Автоматически Флаги diff --git a/manager/app/src/main/res/values-sl/strings.xml b/manager/app/src/main/res/values-sl/strings.xml index 83886e1e..27bf3718 100644 --- a/manager/app/src/main/res/values-sl/strings.xml +++ b/manager/app/src/main/res/values-sl/strings.xml @@ -124,7 +124,6 @@ Selected LKM: %s Shrani Dnevnike Logs saved - SuS SU mode: confirm install module %1$s? unknown module @@ -274,8 +273,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-th/strings.xml b/manager/app/src/main/res/values-th/strings.xml index edd1486c..ed07c50f 100644 --- a/manager/app/src/main/res/values-th/strings.xml +++ b/manager/app/src/main/res/values-th/strings.xml @@ -126,7 +126,6 @@ เลือก LKM: %s บันทึกบันทึก บันทึก Log แล้ว - SuS SU mode: confirm install module %1$s? unknown module @@ -276,8 +275,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml index e3dae4e9..3ee11121 100644 --- a/manager/app/src/main/res/values-tr/strings.xml +++ b/manager/app/src/main/res/values-tr/strings.xml @@ -112,7 +112,6 @@ Yerel LKM dosyası kullan Yalnızca .ko dosyaları desteklenir %1$s bölüm görüntüsü önerilir - (kararsız) KMI seçin Kaldır Geçici olarak kaldır @@ -127,7 +126,6 @@ Seçilen LKM: %s Günlükleri kaydet Günlükler kaydedildi - SuS SU modu: %1$s modülünü yüklemek istediğinizden emin misiniz? Bilinmeyen modül @@ -288,8 +286,6 @@ Gelişmiş Ayarlar Araç çubuğunu özelleştir Geri - SuSFS etkin - SuSFS devre dışı Arka plan başarıyla ayarlandı Özel arka planlar kaldırıldı Alternatif simge @@ -606,7 +602,6 @@ Döngü Yolları Döngü Yolu Ekle - SUS Döngü Yolu Döngü Yolu Yapılandırması Döngü yolları, her kök olmayan (non-root) kullanıcı uygulaması veya yalıtılmış hizmet başlangıcında SUS_PATH olarak yeniden işaretlenir. Bu, eklenen yolların inode durumunun sıfırlanması veya çekirdekte yeniden oluşturulması gibi sorunları gidermeye yardımcı olur. AVC Günlük Kaydı Taklidi @@ -660,7 +655,6 @@ etkin: Çekirdekteki AVC günlük kaydında, \'su\' komutuna ait tcontext\'i \'k Çok Kullanıcılı Uygulama Taraması Etkinleştirildiğinde, iş profilleri de dahil olmak üzere tüm kullanıcıların uygulamalarını tarar. Ayar başarısız oldu, lütfen izinleri kontrol edin - Ayar başarısız oldu: %s Çalışma Zamanı Ortamını Temizle Çalışma zamanı dosyalarını temizleyin ve tarayıcı hizmetini durdurun Çalışma zamanı ortamını temizlemek istediğinizden emin misiniz? Bu işlem tarayıcı hizmetini durduracak ve ilgili dosyaları kaldıracaktır. @@ -703,9 +697,6 @@ etkin: Çekirdekteki AVC günlük kaydında, \'su\' komutuna ait tcontext\'i \'k Günlükleri Temizle Seçili günlük dosyasını temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz. Günlükler başarıyla temizlendi - Günlük Dosyası Seç - Mevcut Günlük - Eski Günlük Türe Göre Filtrele Tüm Türler %2$d girişten %1$d tanesi gösteriliyor diff --git a/manager/app/src/main/res/values-uk/strings.xml b/manager/app/src/main/res/values-uk/strings.xml index 3d6905ba..e4071105 100644 --- a/manager/app/src/main/res/values-uk/strings.xml +++ b/manager/app/src/main/res/values-uk/strings.xml @@ -111,7 +111,6 @@ Ваш пристрій буде **ПРИМУСОВО** завантажено в поточний неактивний слот після перезавантаження!\nВикористовуйте цю опцію лише після завершення OTA.\nПродовжити? Далі Рекомендується образ розділу %1$s - (нестабільно) Вибрати KMI Видалити Тимчасово видалити @@ -126,7 +125,6 @@ Обраний LKM: %s Зберегти логи Логи збережено - Режим SuS SU: Підтвердити встановлення модуля %1$s? невідомий модуль @@ -278,8 +276,6 @@ Розширені налаштування Налаштувати панель інструментів Повернутися - SuSFS увімкнено - SuSFS вимкнено Фон успішно встановлено Видалено власні фони Альтернативна іконка diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index 704533c0..b62325b1 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -110,7 +110,6 @@ Thiết bị của bạn sẽ **BUỘC** phải khởi động vào phân vùng chưa được sử dụng!\nChỉ sử dụng tùy chọn này sau khi cập nhật OTA hoàn tất.\nTiếp tục? Kế tiếp Phân vùng %1$s được khuyến nghị - (Thử nghiệm) Chọn KMI Gỡ cài đặt Gỡ cài đặt tạm thời @@ -125,7 +124,6 @@ Đã chọn LKM: %s Lưu nhật ký Nhật ký đã được lưu - Chế độ SuS SU: Xác nhận cài đặt module %1$s? Module không xác định @@ -279,8 +277,6 @@ Cài đặt nâng cao Cài đặt giao diện Trở lại - SuSFS đã bật - SuSFS đã tắt Đã cài đặt hình nền thành công Đã xóa hình nền tùy chỉnh Thay thế icon @@ -597,7 +593,6 @@ Đường dẫn Vòng lặp Thêm Đường dẫn Vòng lặp - Đường dẫn Vòng lặp SuS Cấu hình Đường dẫn Vòng lặp Đường dẫn Vòng lặp được đổi tên thành SUS_PATH mỗi khi một ứng dụng không phải root hoặc dịch vụ cô lập được khởi động. Điều này giúp giải quyết vấn đề đường dẫn đã thêm có thể trở nên không hợp lệ do trạng thái inode được đặt lại hoặc inode được tạo lại trong Kernel Giả mạo nhật ký AVC @@ -651,7 +646,6 @@ Bật: Kích hoạt tính năng giả mạo sus tcontext của \'su\' thành \'k Quét ứng dụng nhiều người dùng Khi được bật, tất cả ứng dụng của người dùng sẽ được quét, bao gồm cả dữ liệu công việc, v.v Thiết lập thất bại, vui lòng kiểm tra quyền - Thiết lập thất bại: %s Dọn dẹp môi trường hoạt động Dọn dẹp các file hoạt động và dừng quét các dịch vụ Bạn có chắc chắn muốn dọn dẹp môi trường hoạt động không? Thao tác này sẽ dừng dịch vụ quét và xóa các file liên quan @@ -694,9 +688,6 @@ Bật: Kích hoạt tính năng giả mạo sus tcontext của \'su\' thành \'k Xoá nhật ký Bạn có chắc chắn muốn xóa tệp nhật ký đã chọn không? Thao tác này không thể hoàn tác Đã xoá nhật ký thành công - Chọn tệp nhật ký - Nhật ký hiện tại - Nhật ký cũ Lọc theo loại Tất cả các loại Hiển thị %1$d trong tổng %2$d nhật ký 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 272755a3..ea774599 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -113,7 +113,6 @@ 使用本地 LKM 文件 仅支持选择 .ko 文件 建议选择 %1$s 分区镜像 - (实验性的) 选择 KMI 卸载 临时卸载 @@ -128,7 +127,6 @@ 已选择的 LKM:%s 保存日志 日志已保存 - SuS SU 模式: 确认安装模块 %1$s? 未知模块 @@ -289,8 +287,6 @@ 高级设置 外观设置 返回 - SuSFS 已启用 - SuSFS 已禁用 背景设置成功 已移除自定义背景 备选图标 @@ -607,7 +603,6 @@ 循环路径 添加循环路径 - SuS 循环路径 循环路径配置 循环路径会在每次非 root 用户应用或隔离服务启动时重新标记为 SUS_PATH。这有助于解决添加的路径可能因 inode 状态重置或内核中 inode 重新创建而失效的问题 AVC 日志欺骗 @@ -661,7 +656,6 @@ 多用户应用扫描 开启后将扫描所有用户的应用,包括工作资料等 设置失败,请检查权限 - 设置失败: %s 清理运行环境 清理运行时文件并停止扫描服务 您确定要清理运行环境吗?这将停止扫描服务并删除相关文件 @@ -704,9 +698,6 @@ 清空日志 确定要清空选中的日志文件吗?此操作无法撤销。 日志清空成功 - 选择日志文件 - 当前日志 - 旧日志 按类型筛选 所有类型 显示 %1$d / %2$d 条记录 @@ -733,8 +724,6 @@ 添加或删除路径后需要重启设备才能生效。系统会在下次启动时应用新的配置。 添加 Umount 路径 挂载路径 - 检查挂载类型 - 检查是否为 overlay 类型 卸载标志 0=正常卸载, 8=MNT_DETACH, -1=自动 标志 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 2db31602..e78faec6 100644 --- a/manager/app/src/main/res/values-zh-rHK/strings.xml +++ b/manager/app/src/main/res/values-zh-rHK/strings.xml @@ -124,7 +124,6 @@ 選擇嘅 LKM:%s 存儲日誌 日誌已存儲 - SuS SU 模式: 確認安裝模組 %1$s? 未知模組 @@ -276,8 +275,6 @@ 高級配置 外觀配置 返回 - SuSFS 已啟用 - SuSFS 已禁用 背景設定成功 已移除自定義背景 備選圖標 @@ -576,7 +573,6 @@ Zygisk 實現 - SuS 循環路徑 循環路徑配置 循環路徑會喺每次非 root 用戶應用程式或者隔離服務啟動時,重新標記做 SUS_PATH。咁樣可以解決因為 inode 狀態重設或者核心重新建立 inode 而令到添加嘅路徑失效嘅問題。 AVC 日誌欺騙 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 fae212c0..deac5de4 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -110,7 +110,6 @@ 將在重新啟動後強制切換至另一槽位!\n注意:僅能在 OTA 更新完成後重新啟動前使用。\n確定繼續? 下一步 建議選擇 %1$s 分區映像檔 - (實驗性的) 選擇 KMI 解除安裝 臨時解除安裝 @@ -125,7 +124,6 @@ 已選擇的 LKM:%s 儲存日誌 日誌已儲存 - SuS SU 模式: 確定安裝模組 %1$s? 未知模組 @@ -279,8 +277,6 @@ 進階設定 外觀設定 返回 - SuSFS 已啟用 - SuSFS 已禁用 背景設定成功 已移除自訂背景 備用圖示 @@ -593,7 +589,6 @@ 循環路徑 新增循環路徑 - SuS 循環路徑 循環路徑設定 循環路徑會在每次非 root 使用者應用程式或隔離服務啟動時重新標記為 SUS_PATH。這有助於解決新增的路徑可能因 inode 狀態重設或內核中 inode 重新建立而失效的問題 AVC 日誌偽裝 @@ -647,7 +642,6 @@ 多使用者應用掃描 開啟後將掃描所有使用者的應用,包括工作資料等 設定失敗,請檢查許可權 - 設定失敗: %s 清理執行環境 清理執行時檔案並停止掃描服務 您確定要清理執行環境嗎?這將停止掃描服務並刪除相關檔案 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index de0acf4b..b06e5801 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -115,7 +115,6 @@ Use local LKM file Only .ko files are supported %1$s partition image is recommended - (Unstable) Select KMI Uninstall Uninstall temporarily @@ -130,7 +129,6 @@ Selected LKM: %s Save logs Logs saved - SuS SU mode: Confirm install module %1$s? Unknown module @@ -292,8 +290,6 @@ Advanced Settings Customize the toolbar Comeback - SuSFS enabled - SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon @@ -610,7 +606,6 @@ Loop Paths Add Loop Path - SUS Loop Path Loop Path Configuration Loop paths are re-flagged as SUS_PATH on each non-root user app or isolated service startup. This helps address issues where added paths may have their inode status reset or inode re-created in the kernel AVC Log Spoofing @@ -668,7 +663,6 @@ Important Note:\n Multi-User Application Scanning When enabled, scans applications for all users, including work profiles Setting failed, please check permissions - Setting failed: %s Clean Runtime Environment Clean up runtime files and stop the scanner service Are you sure you want to clean the runtime environment? This will stop the scanner service and remove related files. @@ -711,9 +705,6 @@ Important Note:\n Clear Logs Are you sure you want to clear the selected log file? This action cannot be undone. Logs cleared successfully - Select Log File - Current Log - Old Log Filter by Type All Types Showing %1$d of %2$d entries @@ -742,8 +733,6 @@ Important Note:\n A reboot is required for changes to take effect. The system will apply the new configuration on the next boot. Add Umount Path Mount Path - Check Mount Type - Check if it is an overlay type Unmount Flags 0=Normal unmount, 8=MNT_DETACH, -1=Auto Flags diff --git a/userspace/ksud/src/cli.rs b/userspace/ksud/src/cli.rs index 4b042b24..1bd53bcd 100644 --- a/userspace/ksud/src/cli.rs +++ b/userspace/ksud/src/cli.rs @@ -390,6 +390,32 @@ enum Kernel { /// mount point mnt: String, }, + /// Manage umount list + Umount { + #[command(subcommand)] + command: UmountOp, + }, + /// Notify that module is mounted + NotifyModuleMounted, +} + +#[derive(clap::Subcommand, Debug)] +enum UmountOp { + /// Add mount point to umount list + Add { + /// mount point path + mnt: String, + /// umount flags (default: 0, MNT_DETACH: 2) + #[arg(short, long, default_value = "0")] + flags: u32, + }, + /// Delete mount point from umount list + Del { + /// mount point path + mnt: String, + }, + /// Wipe all entries from umount list + Wipe, } #[cfg(target_arch = "aarch64")] @@ -425,7 +451,6 @@ enum Umount { /// Check mount type (overlay) #[arg(long, default_value = "false")] - check_mnt: bool, /// Umount flags (0 or 8 for MNT_DETACH) #[arg(long, default_value = "-1")] @@ -606,6 +631,15 @@ pub fn run() -> Result<()> { } => crate::boot_patch::restore(boot, magiskboot, flash), Commands::Kernel { command } => match command { Kernel::NukeExt4Sysfs { mnt } => ksucalls::nuke_ext4_sysfs(&mnt), + Kernel::Umount { command } => match command { + UmountOp::Add { mnt, flags } => ksucalls::umount_list_add(&mnt, flags), + UmountOp::Del { mnt } => ksucalls::umount_list_del(&mnt), + UmountOp::Wipe => ksucalls::umount_list_wipe().map_err(Into::into), + }, + Kernel::NotifyModuleMounted => { + ksucalls::report_module_mounted(); + Ok(()) + } }, #[cfg(target_arch = "aarch64")] Commands::Kpm { command } => { @@ -627,11 +661,7 @@ pub fn run() -> Result<()> { } } Commands::Umount { command } => match command { - Umount::Add { - path, - check_mnt, - flags, - } => crate::umount_manager::add_umount_path(&path, check_mnt, flags), + Umount::Add { path, flags } => crate::umount_manager::add_umount_path(&path, flags), Umount::Remove { path } => crate::umount_manager::remove_umount_path(&path), Umount::List => crate::umount_manager::list_umount_paths(), Umount::ClearCustom => crate::umount_manager::clear_custom_paths(), diff --git a/userspace/ksud/src/ksucalls.rs b/userspace/ksud/src/ksucalls.rs index 6016a368..4a814d2a 100644 --- a/userspace/ksud/src/ksucalls.rs +++ b/userspace/ksud/src/ksucalls.rs @@ -18,6 +18,7 @@ const KSU_IOCTL_SET_FEATURE: u32 = 0x40004b0e; // _IOC(_IOC_WRITE, 'K', 14, 0) const KSU_IOCTL_GET_WRAPPER_FD: u32 = 0x40004b0f; // _IOC(_IOC_WRITE, 'K', 15, 0) const KSU_IOCTL_MANAGE_MARK: u32 = 0xc0004b10; // _IOC(_IOC_READ|_IOC_WRITE, 'K', 16, 0) const KSU_IOCTL_NUKE_EXT4_SYSFS: u32 = 0x40004b11; // _IOC(_IOC_WRITE, 'K', 17, 0) +const KSU_IOCTL_ADD_TRY_UMOUNT: u32 = 0x40004b12; // _IOC(_IOC_WRITE, 'K', 18, 0) #[repr(C)] #[derive(Clone, Copy, Default)] @@ -80,12 +81,25 @@ pub struct NukeExt4SysfsCmd { pub arg: u64, } +#[repr(C)] +#[derive(Clone, Copy, Default)] +struct AddTryUmountCmd { + arg: u64, // char ptr, this is the mountpoint + flags: u32, // this is the flag we use for it + mode: u8, // denotes what to do with it 0:wipe_list 1:add_to_list 2:delete_entry +} + // Mark operation constants const KSU_MARK_GET: u32 = 1; const KSU_MARK_MARK: u32 = 2; const KSU_MARK_UNMARK: u32 = 3; const KSU_MARK_REFRESH: u32 = 4; +// Umount operation constants +const KSU_UMOUNT_WIPE: u8 = 0; +const KSU_UMOUNT_ADD: u8 = 1; +const KSU_UMOUNT_DEL: u8 = 2; + // Global driver fd cache #[cfg(any(target_os = "linux", target_os = "android"))] static DRIVER_FD: OnceLock = OnceLock::new(); @@ -310,3 +324,38 @@ pub fn nuke_ext4_sysfs(mnt: &str) -> anyhow::Result<()> { ksuctl(KSU_IOCTL_NUKE_EXT4_SYSFS, &mut ioctl_cmd as *mut _)?; Ok(()) } + +/// Wipe all entries from umount list +pub fn umount_list_wipe() -> std::io::Result<()> { + let mut cmd = AddTryUmountCmd { + arg: 0, + flags: 0, + mode: KSU_UMOUNT_WIPE, + }; + ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?; + Ok(()) +} + +/// Add mount point to umount list +pub fn umount_list_add(path: &str, flags: u32) -> anyhow::Result<()> { + let c_path = std::ffi::CString::new(path)?; + let mut cmd = AddTryUmountCmd { + arg: c_path.as_ptr() as u64, + flags, + mode: KSU_UMOUNT_ADD, + }; + ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?; + Ok(()) +} + +/// Delete mount point from umount list +pub fn umount_list_del(path: &str) -> anyhow::Result<()> { + let c_path = std::ffi::CString::new(path)?; + let mut cmd = AddTryUmountCmd { + arg: c_path.as_ptr() as u64, + flags: 0, + mode: KSU_UMOUNT_DEL, + }; + ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?; + Ok(()) +} diff --git a/userspace/ksud/src/umount_manager.rs b/userspace/ksud/src/umount_manager.rs index d2c30064..41fd5562 100644 --- a/userspace/ksud/src/umount_manager.rs +++ b/userspace/ksud/src/umount_manager.rs @@ -13,7 +13,6 @@ const KSU_IOCTL_UMOUNT_MANAGER: u32 = 0xc0004b6b; // _IOC(_IOC_READ|_IOC_WRITE, #[derive(Clone, Serialize, Deserialize, Debug)] pub struct UmountEntry { pub path: String, - pub check_mnt: bool, pub flags: i32, pub is_default: bool, } @@ -34,7 +33,6 @@ pub struct UmountManager { struct UmountManagerCmd { pub operation: u32, pub path: [u8; 256], - pub check_mnt: u8, pub flags: i32, pub count: u32, pub entries_ptr: u64, @@ -45,7 +43,6 @@ impl Default for UmountManagerCmd { UmountManagerCmd { operation: 0, path: [0; 256], - check_mnt: 0, flags: 0, count: 0, entries_ptr: 0, @@ -112,7 +109,7 @@ impl UmountManager { Ok(()) } - pub fn add_entry(&mut self, path: &str, check_mnt: bool, flags: i32) -> Result<()> { + pub fn add_entry(&mut self, path: &str, flags: i32) -> Result<()> { let exists = self .defaults .iter() @@ -126,7 +123,6 @@ impl UmountManager { let entry = UmountEntry { path: path.to_string(), - check_mnt, flags, is_default, }; @@ -165,43 +161,36 @@ impl UmountManager { vec![ UmountEntry { path: "/odm".to_string(), - check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/system".to_string(), - check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/vendor".to_string(), - check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/product".to_string(), - check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/system_ext".to_string(), - check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/data/adb/modules".to_string(), - check_mnt: false, flags: -1, // MNT_DETACH is_default: true, }, UmountEntry { path: "/debug_ramdisk".to_string(), - check_mnt: false, flags: -1, // MNT_DETACH is_default: true, }, @@ -226,7 +215,6 @@ impl UmountManager { fn kernel_add_entry(entry: &UmountEntry) -> Result<()> { let mut cmd = UmountManagerCmd { operation: 0, - check_mnt: entry.check_mnt as u8, flags: entry.flags, ..Default::default() }; @@ -255,9 +243,9 @@ pub fn init_umount_manager() -> Result { Ok(manager) } -pub fn add_umount_path(path: &str, check_mnt: bool, flags: i32) -> Result<()> { +pub fn add_umount_path(path: &str, flags: i32) -> Result<()> { let mut manager = init_umount_manager()?; - manager.add_entry(path, check_mnt, flags)?; + manager.add_entry(path, flags)?; manager.save_config()?; println!("✓ Added umount path: {}", path); Ok(()) @@ -280,17 +268,13 @@ pub fn list_umount_paths() -> Result<()> { return Ok(()); } - println!( - "{:<30} {:<12} {:<8} {:<10}", - "Path", "CheckMnt", "Flags", "Default" - ); + println!("{:<30} {:<8} {:<10}", "Path", "Flags", "Default"); println!("{}", "=".repeat(60)); for entry in entries { println!( - "{:<30} {:<12} {:<8} {:<10}", + "{:<30} {:<8} {:<10}", entry.path, - entry.check_mnt, entry.flags, if entry.is_default { "Yes" } else { "No" } );