diff --git a/native/jni/magiskhide/hide_utils.cpp b/native/jni/magiskhide/hide_utils.cpp index 566b5a50e..edff96f2a 100644 --- a/native/jni/magiskhide/hide_utils.cpp +++ b/native/jni/magiskhide/hide_utils.cpp @@ -99,24 +99,40 @@ static void kill_process(const char *name, bool multi = false, }); } -static bool validate(const char *s) { - if (strcmp(s, ISOLATED_MAGIC) == 0) - return true; - bool dot = false; - for (char c; (c = *s); ++s) { - if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || - (c >= '0' && c <= '9') || c == '_' || c == ':') { - continue; +static bool validate(const char *pkg, const char *proc) { + bool pkg_valid = false; + bool proc_valid = true; + + if (str_eql(pkg, ISOLATED_MAGIC)) { + pkg_valid = true; + for (char c; (c = *proc); ++proc) { + if (isalnum(c) || c == '_' || c == '.') + continue; + if (c == ':') + break; + proc_valid = false; + break; } - if (SDK_INT >= 29 && c == '$') - continue; - if (c == '.') { - dot = true; - continue; + } else { + for (char c; (c = *pkg); ++pkg) { + if (isalnum(c) || c == '_') + continue; + if (c == '.') { + pkg_valid = true; + continue; + } + pkg_valid = false; + break; + } + + for (char c; (c = *proc); ++proc) { + if (isalnum(c) || c == '_' || c == ':' || c == '.') + continue; + proc_valid = false; + break; } - return false; } - return dot; + return pkg_valid && proc_valid; } static void add_hide_set(const char *pkg, const char *proc) { @@ -134,7 +150,7 @@ static int add_list(const char *pkg, const char *proc) { if (proc[0] == '\0') proc = pkg; - if (!validate(pkg) || !validate(proc)) + if (!validate(pkg, proc)) return HIDE_INVALID_PKG; for (auto &hide : hide_set)