diff --git a/.gitmodules b/.gitmodules
index 191ffd656e9f..4473536d4dfa 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -22,9 +22,6 @@
[submodule "zlib"]
path = native/src/external/zlib
url = https://android.googlesource.com/platform/external/zlib
-[submodule "parallel-hashmap"]
- path = native/src/external/parallel-hashmap
- url = https://github.com/greg7mdp/parallel-hashmap.git
[submodule "zopfli"]
path = native/src/external/zopfli
url = https://github.com/google/zopfli.git
diff --git a/README.MD b/README.MD
index 0f2bff1005fe..cb4bfcd34044 100644
--- a/README.MD
+++ b/README.MD
@@ -19,8 +19,8 @@ Some highlight features:
[Github](https://github.com/topjohnwu/Magisk/) is the only source where you can get official Magisk information and downloads.
-[![](https://img.shields.io/badge/Magisk-v26.3-blue)](https://github.com/topjohnwu/Magisk/releases/tag/v26.3)
-[![](https://img.shields.io/badge/Magisk%20Beta-v26.3-blue)](https://github.com/topjohnwu/Magisk/releases/tag/v26.3)
+[![](https://img.shields.io/badge/Magisk-v26.4-blue)](https://github.com/topjohnwu/Magisk/releases/tag/v26.4)
+[![](https://img.shields.io/badge/Magisk%20Beta-v26.4-blue)](https://github.com/topjohnwu/Magisk/releases/tag/v26.4)
[![](https://img.shields.io/badge/Magisk-Canary-red)](https://raw.githubusercontent.com/topjohnwu/magisk-files/canary/app-release.apk)
[![](https://img.shields.io/badge/Magisk-Debug-red)](https://raw.githubusercontent.com/topjohnwu/magisk-files/canary/app-debug.apk)
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 24d2bdc2fd9b..dd7ad5c575dd 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -34,7 +34,7 @@
Zorla şifrelemeyi koru
AVB 2.0/dm-verity\'yi koruyun
- Önyükleme görüntüsünde vbmeta yaması
+ Önyükleme görüntüsünde vbmeta yamasını uygula
Kurtarma Modu
Seçenekler
Yöntem
@@ -55,24 +55,24 @@
Bir uygulama bir Süper Kullanıcı isteğini engellediği için Magisk yanıtınızı doğrulayamıyor
Reddet
Hemen
- İzin
- Cihazınıza tam erişim sağlar.\nEmin değilseniz reddedin!
+ İzin ver
+ Cihazınıza tam erişim sağlar.\nEğer emin değilseniz reddedin!
Daima
Bir kere
10 dakika
20 dakika
30 dakika
60 dakika
- %1$s Süper Kullanıcı hakları verildi
- %1$s Süper Kullanıcı hakları reddedildi
- %1$s Süper Kullanıcı hakları verildi
- %1$s Süper Kullanıcı hakları reddedildi
- %1$s bildirimleri etkinleştirildi
- %1$s bildirimleri devre dışı bırakıldı
- %1$s günlüğü etkinleştirildi
- %1$s günlüğü devre dışı bırakıldı
+ %1$s uygulamasının Süper Kullanıcı izni verildi
+ %1$s uygulamasının Süper Kullanıcı izni reddedildi
+ %1$s uygulamasının Süper Kullanıcı izni verildi
+ %1$s uygulamasının Süper Kullanıcı izni reddedildi
+ %1$s uygulamasının bildirimleri etkinleştirildi
+ %1$s uygulamasının bildirimleri devre dışı bırakıldı
+ %1$s uygulamasının günlüğü etkinleştirildi
+ %1$s uygulamasının günlüğü devre dışı bırakıldı
İptal et?
- %1$s Süper Kullanıcı haklarını iptal etmeyi onaylayın
+ %1$s uygulamasının Süper Kullanıcı haklarını iptal etmeyi onaylayın
Tost
Hiçbiri
@@ -99,11 +99,11 @@
(Bilgi verilmedi)
- Yumuşak yeniden başlatma
- Kurtarma için Yeniden Başlatın
- Bootloader için Yeniden Başlatın
- İndirmek için Yeniden Başlatın
- EDL için Yeniden Başlatın
+ Yazılımsal olarak yeniden başlat
+ Kurtarma modunda Yeniden Başlat
+ Önyükleyici modunda Yeniden Başlat
+ Download modu için Yeniden Başlat
+ EDL modunda Yeniden Başlat
%1$s / %2$s
Kaldır
Geri yükle
@@ -119,9 +119,9 @@
Tema Modu
Tarzınıza en uygun modu seçin!
- Daima Açık
+ Her zaman Açık
Sistemi Takip Et
- Daima Koyu
+ Her zaman Koyu
İndirme yolu
Dosyalar %1$s konumuna kaydedilecek
Magisk uygulamasını gizleyin
@@ -131,7 +131,7 @@
Dil
(Sistem Varsayılanı)
Güncellemeleri Kontrol Et
- Arka planda güncellemeleri periyodik olarak kontrol edin
+ Arka planda güncellemeleri düzenli olarak kontrol edin
Güncelleme Kanalı
Stabil
Beta
@@ -165,7 +165,7 @@
Süper Kullanıcı Bildirimi
Yükseltmeden sonra yeniden kimlik doğrulaması yapın
Uygulamaları yükselttikten sonra Süper Kullanıcı izinlerini tekrar isteyin
- Sahte Ekran Koruması
+ Sahte Ekran (Tapjacking) Koruması
Süper Kullanıcı bilgi istemi iletişim kutusu, herhangi bir başka pencere veya yer paylaşımı tarafından engellendiğinde girişe yanıt vermeyecektir.
Özelleştir
Uygulamayı gizledikten sonra adın ve simgenin tanınmasının zor olması durumunda ana ekrana güzel bir kısayol ekleyin
@@ -216,7 +216,7 @@
Geri yükleme tamamlandı!
Stok yedeği mevcut değil!
Kurulum başarısız oldu
- Ek Kurulum Gerektirir
+ Ek Kurulum Gerekiyor
Magisk\'in düzgün çalışması için cihazınızın ek kuruluma ihtiyacı var. Devam etmek ve yeniden başlatmak istiyor musunuz?
Cihazınızın düzgün çalışması için Magisk\'in yeniden yüklenmeye ihtiyacı var. Lütfen Magisk\'i uygulama içinde yeniden yükleyin, kurtarma modu doğru cihaz bilgilerini alamıyor.
Ortam kurulumu çalıştırılıyor…
@@ -224,18 +224,18 @@
Desteklenmeyen Magisk Sürümü
Uygulamanın bu sürümü, %1$s\'den daha düşük Magisk sürümlerini desteklemiyor.\n\nUygulama, Magisk kurulu değilmiş gibi davranacak, lütfen Magisk\'i mümkün olan en kısa sürede yükseltin.
Anormal Durum
- Bu uygulamayı bir sistem uygulaması olarak çalıştırmak desteklenmiyor. Lütfen uygulamayı bir kullanıcı uygulamasına geri döndürün.
- Magisk\'ten olmayan bir \"su\" ikili dosyası algılandı. Lütfen rakip kök çözümlerini kaldırın ve/veya Magisk\'i yeniden yükleyin.
+ Bu uygulamayı bir sistem uygulaması olarak çalıştırma desteklenmiyor. Lütfen uygulamayı bir kullanıcı uygulamasına geri döndürün.
+ Magisk\'ten olmayan bir \"su\" ikili dosyası algılandı. Lütfen başka kök çözümlerini kaldırın ve/veya Magisk\'i yeniden yükleyin.
Magisk, harici depolama birimine kurulur. Lütfen uygulamayı dahili depolamaya taşıyın.
Kök kaybolduğu için gizli Magisk uygulaması çalışmaya devam edemiyor. Lütfen orijinal APK\'yı geri yükleyin.
@string/settings_restore_app_title
- Bu işlevi etkinleştirmek için depolama izni verin
- Bu işlevi etkinleştirmek için bildirim izni verin
- Bu işlevi etkinleştirmek için "bilinmeyen uygulamaları yükle"ye izin verin
+ Bu işlevi etkinleştirmek için depolama izni veriniz.
+ Bu işlevi etkinleştirmek için bildirim izni veriniz.
+ Bu işlevi etkinleştirmek için "Bilinmeyen uygulamaları yükle" ayarına izin veriniz.
Ana ekrana kısayol ekle
Bu uygulamayı gizledikten sonra adını ve simgesini tanımak zorlaşabilir. Ana ekrana hoş bir kısayol eklemek ister misiniz?
Bu eylemi gerçekleştirecek uygulama bulunamadı
Değişiklikleri uygulamak için yeniden başlatın
- Bu, gizli uygulamayı orijinal uygulamaya geri yükleyecektir. Gerçekten bunu yapmak istiyor musun?
+ Bu işlem, gizli uygulamayı orijinal uygulama ile değiştirecektir. Bu işlemi yapmak istediğinizden emin misiniz?
diff --git a/build.py b/build.py
index e34ec66676eb..55af084e05af 100755
--- a/build.py
+++ b/build.py
@@ -246,7 +246,7 @@ def run_ndk_build(flags):
error("Build binary failed!")
os.chdir("..")
for arch in archs:
- for tgt in support_targets + ["libinit-ld.so", "libzygisk-ld.so"]:
+ for tgt in support_targets + ["libinit-ld.so"]:
source = op.join("native", "libs", arch, tgt)
target = op.join("native", "out", arch, tgt)
mv(source, target)
@@ -342,9 +342,6 @@ def dump_bin_header(args):
preload = op.join("native", "out", arch, "libinit-ld.so")
with open(preload, "rb") as src:
text = binary_dump(src, "init_ld_xz")
- preload = op.join("native", "out", arch, "libzygisk-ld.so")
- with open(preload, "rb") as src:
- text += binary_dump(src, "zygisk_ld", compressor=lambda x: x)
write_if_diff(op.join(native_gen_path, f"{arch}_binaries.h"), text)
@@ -395,8 +392,9 @@ def build_binary(args):
flag = ""
clean = False
- if "magisk" in args.target or "magiskinit" in args.target:
- flag += " B_PRELOAD=1"
+ if "magisk" in args.target:
+ flag += " B_MAGISK=1"
+ clean = True
if "magiskpolicy" in args.target:
flag += " B_POLICY=1"
@@ -417,14 +415,10 @@ def build_binary(args):
if flag:
run_ndk_build(flag)
- # magiskinit and magisk embeds preload.so
+ # magiskinit embeds preload.so
flag = ""
- if "magisk" in args.target:
- flag += " B_MAGISK=1"
- clean = True
-
if "magiskinit" in args.target:
flag += " B_INIT=1"
diff --git a/docs/changes.md b/docs/changes.md
index a9125d7fe25a..039cea5f203c 100644
--- a/docs/changes.md
+++ b/docs/changes.md
@@ -1,5 +1,16 @@
# Magisk Changelog
+### v26.4
+
+- [MagiskBoot] Don't pad zeros if signed boot image is larger
+- [MagiskPolicy] Fix `genfscon` and `filename_trans`
+- [MagiskPolicy] Fix bug in `libsepol`
+- [Zygisk] Fix and simplify file descriptor sanitization logic
+- [App] Prevent OOM when patching AP tarfiles
+- [App] Fix bug in device configuration detection
+- [Daemon] Fix certificate parsing of APKs
+- [General] Fix logging errors from C++ code being ignored
+
### v26.3
- [General] Fix device information detection script
diff --git a/docs/releases/26400.md b/docs/releases/26400.md
new file mode 100644
index 000000000000..d0f318e2466d
--- /dev/null
+++ b/docs/releases/26400.md
@@ -0,0 +1,12 @@
+## 2023.11.5 Magisk v26.4
+
+- [MagiskBoot] Don't pad zeros if signed boot image is larger
+- [MagiskPolicy] Fix `genfscon` and `filename_trans`
+- [MagiskPolicy] Fix bug in `libsepol`
+- [Zygisk] Fix and simplify file descriptor sanitization logic
+- [App] Prevent OOM when patching AP tarfiles
+- [App] Fix bug in device configuration detection
+- [Daemon] Fix certificate parsing of APKs
+- [General] Fix logging errors from C++ code being ignored
+
+### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html)
diff --git a/docs/releases/index.md b/docs/releases/index.md
index ce973b9f86c5..6a208d6228df 100644
--- a/docs/releases/index.md
+++ b/docs/releases/index.md
@@ -1,5 +1,6 @@
# Release Notes
+- [v26.4](26400.md)
- [v26.3](26300.md)
- [v26.2](26200.md)
- [v26.1](26100.md)
diff --git a/gradle.properties b/gradle.properties
index 73ee649d7d98..74cdf51720c9 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -27,5 +27,5 @@ android.nonFinalResIds=false
# Magisk
magisk.stubVersion=38
-magisk.versionCode=26302
+magisk.versionCode=26401
magisk.ondkVersion=r26.1
diff --git a/native/src/Android-rs.mk b/native/src/Android-rs.mk
index 2a0027335bdf..cb04a076f747 100644
--- a/native/src/Android-rs.mk
+++ b/native/src/Android-rs.mk
@@ -8,6 +8,7 @@ LIBRARY_PATH = ../out/$(TARGET_ARCH_ABI)/libmagisk-rs.a
ifneq (,$(wildcard $(LOCAL_PATH)/$(LIBRARY_PATH)))
include $(CLEAR_VARS)
LOCAL_MODULE := magisk-rs
+LOCAL_EXPORT_C_INCLUDES := src/core/include
LOCAL_SRC_FILES := $(LIBRARY_PATH)
include $(PREBUILT_STATIC_LIBRARY)
endif
diff --git a/native/src/Android.mk b/native/src/Android.mk
index 1bb0c2d995b1..0a6b82942f1f 100644
--- a/native/src/Android.mk
+++ b/native/src/Android.mk
@@ -11,7 +11,6 @@ LOCAL_MODULE := magisk
LOCAL_STATIC_LIBRARIES := \
libbase \
libsystemproperties \
- libphmap \
liblsplt \
libmagisk-rs
@@ -27,20 +26,19 @@ LOCAL_SRC_FILES := \
core/selinux.cpp \
core/module.cpp \
core/thread.cpp \
- core/resetprop/resetprop.cpp \
core/core-rs.cpp \
+ core/resetprop/resetprop.cpp \
core/su/su.cpp \
core/su/connect.cpp \
core/su/pts.cpp \
core/su/su_daemon.cpp \
- zygisk/entry.cpp \
- zygisk/main.cpp \
- zygisk/utils.cpp \
- zygisk/hook.cpp \
- zygisk/memory.cpp \
- zygisk/deny/cli.cpp \
- zygisk/deny/utils.cpp \
- zygisk/deny/revert.cpp
+ core/zygisk/entry.cpp \
+ core/zygisk/main.cpp \
+ core/zygisk/module.cpp \
+ core/zygisk/hook.cpp \
+ core/deny/cli.cpp \
+ core/deny/utils.cpp \
+ core/deny/revert.cpp
LOCAL_LDLIBS := -llog
LOCAL_LDFLAGS := -Wl,--dynamic-list=src/exported_sym.txt
@@ -57,12 +55,6 @@ LOCAL_SRC_FILES := init/preload.c
LOCAL_STRIP_MODE := --strip-all
include $(BUILD_SHARED_LIBRARY)
-include $(CLEAR_VARS)
-LOCAL_MODULE := zygisk-ld
-LOCAL_SRC_FILES := zygisk/loader.c
-LOCAL_STRIP_MODE := --strip-all
-include $(BUILD_SHARED_LIBRARY)
-
endif
ifdef B_INIT
diff --git a/native/src/base/include/base.hpp b/native/src/base/include/base.hpp
index 7ca70dc5f530..01d350a5821e 100644
--- a/native/src/base/include/base.hpp
+++ b/native/src/base/include/base.hpp
@@ -4,7 +4,6 @@
#include "../files.hpp"
#include "../misc.hpp"
#include "../logging.hpp"
-#include "../missing.hpp"
#include "../base-rs.hpp"
using rust::xpipe2;
diff --git a/native/src/base/misc.hpp b/native/src/base/misc.hpp
index ab94bc6a540b..476395fe9933 100644
--- a/native/src/base/misc.hpp
+++ b/native/src/base/misc.hpp
@@ -262,9 +262,9 @@ std::vector split(std::string_view s, std::string_view delims);
std::vector split_view(std::string_view, std::string_view delims);
// Similar to vsnprintf, but the return value is the written number of bytes
-int vssprintf(char *dest, size_t size, const char *fmt, va_list ap);
+__printflike(3, 0) int vssprintf(char *dest, size_t size, const char *fmt, va_list ap);
// Similar to snprintf, but the return value is the written number of bytes
-int ssprintf(char *dest, size_t size, const char *fmt, ...);
+__printflike(3, 4) int ssprintf(char *dest, size_t size, const char *fmt, ...);
// This is not actually the strscpy from the Linux kernel.
// Silently truncates, and returns the number of bytes written.
extern "C" size_t strscpy(char *dest, const char *src, size_t size);
diff --git a/native/src/base/missing.hpp b/native/src/base/missing.hpp
deleted file mode 100644
index c33f3138c593..000000000000
--- a/native/src/base/missing.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#include
-#include
-#include
-#include
-#include
-
-static inline int fexecve(int fd, char* const* argv, char* const* envp) {
- syscall(__NR_execveat, fd, "", argv, envp, AT_EMPTY_PATH);
- if (errno == ENOSYS) {
- char buf[256];
- ssprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
- execve(buf, argv, envp);
- }
- return -1;
-}
diff --git a/native/src/base/xwrap.hpp b/native/src/base/xwrap.hpp
index ce7a6dda8778..917e300dc550 100644
--- a/native/src/base/xwrap.hpp
+++ b/native/src/base/xwrap.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include
#include
#include
#include
diff --git a/native/src/core/applet_stub.cpp b/native/src/core/applet_stub.cpp
index 52a6f32dfff6..291abb962a16 100644
--- a/native/src/core/applet_stub.cpp
+++ b/native/src/core/applet_stub.cpp
@@ -1,6 +1,6 @@
#include
-#include
+#include
#include
#include
diff --git a/native/src/core/applets.cpp b/native/src/core/applets.cpp
index a81712be0931..0b6d0b537039 100644
--- a/native/src/core/applets.cpp
+++ b/native/src/core/applets.cpp
@@ -2,7 +2,7 @@
#include
#include
-#include
+#include
#include
#include
@@ -31,11 +31,6 @@ int main(int argc, char *argv[]) {
string_view argv0 = basename(argv[0]);
- // app_process is actually not an applet
- if (argv0.starts_with("app_process")) {
- return app_process_main(argc, argv);
- }
-
umask(0);
if (argv[0][0] == '\0') {
diff --git a/native/src/core/bootstages.cpp b/native/src/core/bootstages.cpp
index 8457da38343e..45c1722f94cd 100644
--- a/native/src/core/bootstages.cpp
+++ b/native/src/core/bootstages.cpp
@@ -6,14 +6,12 @@
#include
#include
-#include
+#include
#include
#include
-#include
+#include
#include
-#include "core.hpp"
-
using namespace std;
// Boot stage state
@@ -45,21 +43,24 @@ static bool mount_mirror(const std::string_view from, const std::string_view to)
static void mount_mirrors() {
LOGI("* Mounting mirrors\n");
auto self_mount_info = parse_mount_info("self");
+ char path[64];
// Bind remount module root to clear nosuid
if (access(SECURE_DIR, F_OK) == 0 || SDK_INT < 24) {
- auto dest = MAGISKTMP + "/" MODULEMNT;
+ ssprintf(path, sizeof(path), "%s/" MODULEMNT, get_magisk_tmp());
xmkdir(SECURE_DIR, 0700);
xmkdir(MODULEROOT, 0755);
- xmkdir(dest.data(), 0755);
- xmount(MODULEROOT, dest.data(), nullptr, MS_BIND, nullptr);
- xmount(nullptr, dest.data(), nullptr, MS_REMOUNT | MS_BIND | MS_RDONLY, nullptr);
- xmount(nullptr, dest.data(), nullptr, MS_PRIVATE, nullptr);
+ xmkdir(path, 0755);
+ xmount(MODULEROOT, path, nullptr, MS_BIND, nullptr);
+ xmount(nullptr, path, nullptr, MS_REMOUNT | MS_BIND | MS_RDONLY, nullptr);
+ xmount(nullptr, path, nullptr, MS_PRIVATE, nullptr);
chmod(SECURE_DIR, 0700);
}
// Check and mount preinit mirror
- if (struct stat st{}; stat((MAGISKTMP + "/" PREINITDEV).data(), &st) == 0 && (st.st_mode & S_IFBLK)) {
+ char dev_path[64];
+ ssprintf(dev_path, sizeof(dev_path), "%s/" PREINITDEV, get_magisk_tmp());
+ if (struct stat st{}; stat(dev_path, &st) == 0 && S_ISBLK(st.st_mode)) {
// DO NOT mount the block device directly, as we do not know the flags and configs
// to properly mount the partition; mounting block devices directly as rw could cause
// crashes if the filesystem driver is crap (e.g. some broken F2FS drivers).
@@ -67,6 +68,7 @@ static void mount_mirrors() {
// mount point mounting our desired partition, and then bind mount the target folder.
dev_t preinit_dev = st.st_rdev;
bool mounted = false;
+ ssprintf(path, sizeof(path), "%s/" PREINITMIRR, get_magisk_tmp());
for (const auto &info: self_mount_info) {
if (info.root == "/" && info.device == preinit_dev) {
auto flags = split_view(info.fs_option, ",");
@@ -76,29 +78,28 @@ static void mount_mirrors() {
if (!rw) continue;
string preinit_dir = resolve_preinit_dir(info.target.data());
xmkdir(preinit_dir.data(), 0700);
- auto mirror_dir = MAGISKTMP + "/" PREINITMIRR;
- if ((mounted = mount_mirror(preinit_dir, mirror_dir))) {
- xmount(nullptr, mirror_dir.data(), nullptr, MS_UNBINDABLE, nullptr);
+ if ((mounted = mount_mirror(preinit_dir, path))) {
+ xmount(nullptr, path, nullptr, MS_UNBINDABLE, nullptr);
break;
}
}
}
if (!mounted) {
LOGW("preinit mirror not mounted %u:%u\n", major(preinit_dev), minor(preinit_dev));
- unlink((MAGISKTMP + "/" PREINITDEV).data());
+ unlink(dev_path);
}
}
// Prepare worker
- auto worker_dir = MAGISKTMP + "/" WORKERDIR;
- xmount("worker", worker_dir.data(), "tmpfs", 0, "mode=755");
- xmount(nullptr, worker_dir.data(), nullptr, MS_PRIVATE, nullptr);
+ ssprintf(path, sizeof(path), "%s/" WORKERDIR, get_magisk_tmp());
+ xmount("worker", path, "tmpfs", 0, "mode=755");
+ xmount(nullptr, path, nullptr, MS_PRIVATE, nullptr);
// Recursively bind mount / to mirror dir
- if (auto mirror_dir = MAGISKTMP + "/" MIRRDIR; !mount_mirror("/", mirror_dir)) {
+ if (auto mirror_dir = get_magisk_tmp() + "/"s MIRRDIR; !mount_mirror("/", mirror_dir)) {
LOGI("fallback to mount subtree\n");
// rootfs may fail, fallback to bind mount each mount point
- set> mounted_dirs {{ MAGISKTMP }};
+ set> mounted_dirs {{ get_magisk_tmp() }};
for (const auto &info: self_mount_info) {
if (info.type == "rootfs"sv) continue;
// the greatest mount point that less than info.target, which is possibly a parent
@@ -219,8 +220,6 @@ static bool magisk_env() {
LOGI("* Initializing Magisk environment\n");
preserve_stub_apk();
- string pkg;
- get_manager(0, &pkg);
// Directories in /data/adb
xmkdir(DATABIN, 0755);
@@ -231,13 +230,13 @@ static bool magisk_env() {
if (access(DATABIN "/busybox", X_OK))
return false;
- sprintf(buf, "%s/" BBPATH "/busybox", MAGISKTMP.data());
+ ssprintf(buf, sizeof(buf), "%s/" BBPATH "/busybox", get_magisk_tmp());
mkdir(dirname(buf), 0755);
cp_afc(DATABIN "/busybox", buf);
exec_command_async(buf, "--install", "-s", dirname(buf));
if (access(DATABIN "/magiskpolicy", X_OK) == 0) {
- sprintf(buf, "%s/magiskpolicy", MAGISKTMP.data());
+ ssprintf(buf, sizeof(buf), "%s/magiskpolicy", get_magisk_tmp());
cp_afc(DATABIN "/magiskpolicy", buf);
}
@@ -415,6 +414,8 @@ static void boot_complete() {
// Ensure manager exists
check_pkg_refresh();
get_manager(0, nullptr, true);
+
+ reset_zygisk(true);
}
void boot_stage_handler(int client, int code) {
diff --git a/native/src/core/core.hpp b/native/src/core/core.hpp
deleted file mode 100644
index 7f5148e5bf13..000000000000
--- a/native/src/core/core.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-#pragma once
-
-#include
-#include
-
-#include "core-rs.hpp"
-#include "resetprop/resetprop.hpp"
-
-extern bool RECOVERY_MODE;
-extern std::atomic pkg_xml_ino;
-
-std::string find_preinit_device();
-void unlock_blocks();
-void reboot();
-
-// Module stuffs
-void handle_modules();
-void load_modules();
-void disable_modules();
-void remove_modules();
-void exec_module_scripts(const char *stage);
-
-// Scripting
-void exec_script(const char *script);
-void exec_common_scripts(const char *stage);
-void exec_module_scripts(const char *stage, const std::vector &modules);
-void install_apk(const char *apk);
-void uninstall_pkg(const char *pkg);
-void clear_pkg(const char *pkg, int user_id);
-[[noreturn]] void install_module(const char *file);
diff --git a/native/src/core/daemon.cpp b/native/src/core/daemon.cpp
index 2323adba5cd9..3404e5deb37a 100644
--- a/native/src/core/daemon.cpp
+++ b/native/src/core/daemon.cpp
@@ -3,19 +3,16 @@
#include
#include
-#include
+#include
#include
-#include
+#include
#include
#include
#include
-#include "core.hpp"
-
using namespace std;
int SDK_INT = -1;
-string MAGISKTMP;
bool RECOVERY_MODE = false;
@@ -142,10 +139,11 @@ static void handle_request_async(int client, int code, const sock_cred &cred) {
su_daemon_handler(client, &cred);
break;
case MainRequest::ZYGOTE_RESTART:
- close(client);
LOGI("** zygote restarted\n");
pkg_xml_ino = 0;
prune_su_access();
+ reset_zygisk(false);
+ close(client);
break;
case MainRequest::SQLITE_CMD:
exec_sql(client);
@@ -159,7 +157,6 @@ static void handle_request_async(int client, int code, const sock_cred &cred) {
break;
}
case MainRequest::ZYGISK:
- case MainRequest::ZYGISK_PASSTHROUGH:
zygisk_handler(client, &cred);
break;
default:
@@ -182,11 +179,24 @@ static void handle_request_sync(int client, int code) {
case MainRequest::START_DAEMON:
rust::get_magiskd().setup_logfile();
break;
- case MainRequest::STOP_DAEMON:
+ case MainRequest::STOP_DAEMON: {
+ // Unmount all overlays
denylist_handler(-1, nullptr);
+
+ // Restore native bridge property
+ auto nb = get_prop(NBPROP);
+ auto len = sizeof(ZYGISKLDR) - 1;
+ if (nb == ZYGISKLDR) {
+ set_prop(NBPROP, "0");
+ } else if (nb.size() > len) {
+ set_prop(NBPROP, nb.data() + len);
+ }
+
write_int(client, 0);
+
// Terminate the daemon!
exit(0);
+ }
default:
__builtin_unreachable();
}
@@ -328,9 +338,6 @@ static void daemon_entry() {
}
// Get self stat
- char buf[64];
- xreadlink("/proc/self/exe", buf, sizeof(buf));
- MAGISKTMP = dirname(buf);
xstat("/proc/self/exe", &self_st);
// Get API level
@@ -353,9 +360,11 @@ static void daemon_entry() {
restore_tmpcon();
// Cleanups
- auto mount_list = MAGISKTMP + "/" ROOTMNT;
- if (access(mount_list.data(), F_OK) == 0) {
- file_readline(true, mount_list.data(), [](string_view line) -> bool {
+ const char *tmp = get_magisk_tmp();
+ char path[64];
+ ssprintf(path, sizeof(path), "%s/" ROOTMNT, tmp);
+ if (access(path, F_OK) == 0) {
+ file_readline(true, path, [](string_view line) -> bool {
umount2(line.data(), MNT_DETACH);
return true;
});
@@ -364,11 +373,12 @@ static void daemon_entry() {
xmount(nullptr, "/", nullptr, MS_REMOUNT | MS_RDONLY, nullptr);
unsetenv("REMOUNT_ROOT");
}
- rm_rf((MAGISKTMP + "/" ROOTOVL).data());
+ ssprintf(path, sizeof(path), "%s/" ROOTOVL, tmp);
+ rm_rf(path);
// Load config status
- auto config = MAGISKTMP + "/" MAIN_CONFIG;
- parse_prop_file(config.data(), [](auto key, auto val) -> bool {
+ ssprintf(path, sizeof(path), "%s/" MAIN_CONFIG, tmp);
+ parse_prop_file(path, [](auto key, auto val) -> bool {
if (key == "RECOVERYMODE" && val == "true")
RECOVERY_MODE = true;
return true;
@@ -376,22 +386,22 @@ static void daemon_entry() {
// Use isolated devpts if kernel support
if (access("/dev/pts/ptmx", F_OK) == 0) {
- auto pts = MAGISKTMP + "/" SHELLPTS;
- if (access(pts.data(), F_OK)) {
- xmkdirs(pts.data(), 0755);
- xmount("devpts", pts.data(), "devpts",
- MS_NOSUID | MS_NOEXEC, "newinstance");
- auto ptmx = pts + "/ptmx";
- if (access(ptmx.data(), F_OK)) {
- xumount(pts.data());
- rmdir(pts.data());
+ ssprintf(path, sizeof(path), "%s/" SHELLPTS, tmp);
+ if (access(path, F_OK)) {
+ xmkdirs(path, 0755);
+ xmount("devpts", path, "devpts", MS_NOSUID | MS_NOEXEC, "newinstance");
+ char ptmx[64];
+ ssprintf(ptmx, sizeof(ptmx), "%s/ptmx", path);
+ if (access(ptmx, F_OK)) {
+ xumount(path);
+ rmdir(path);
}
}
}
fd = xsocket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
sockaddr_un addr = {.sun_family = AF_LOCAL};
- strcpy(addr.sun_path, (MAGISKTMP + "/" MAIN_SOCKET).data());
+ ssprintf(addr.sun_path, sizeof(addr.sun_path), "%s/" MAIN_SOCKET, tmp);
unlink(addr.sun_path);
if (xbind(fd, (sockaddr *) &addr, sizeof(addr)))
exit(1);
@@ -411,27 +421,25 @@ static void daemon_entry() {
poll_loop();
}
-string find_magisk_tmp() {
- if (access("/debug_ramdisk/" INTLROOT, F_OK) == 0) {
- return "/debug_ramdisk";
- }
- if (access("/sbin/" INTLROOT, F_OK) == 0) {
- return "/sbin";
- }
- // Fallback to lookup from mountinfo for manual mount, e.g. avd
- for (const auto &mount: parse_mount_info("self")) {
- if (mount.source == "magisk" && mount.root == "/") {
- return mount.target;
+const char *get_magisk_tmp() {
+ static const char *path = nullptr;
+ if (path == nullptr) {
+ if (access("/debug_ramdisk/" INTLROOT, F_OK) == 0) {
+ path = "/debug_ramdisk";
+ } else if (access("/sbin/" INTLROOT, F_OK) == 0) {
+ path = "/sbin";
+ } else {
+ path = "";
}
}
- return "";
+ return path;
}
int connect_daemon(int req, bool create) {
int fd = xsocket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
sockaddr_un addr = {.sun_family = AF_LOCAL};
- string tmp = find_magisk_tmp();
- strcpy(addr.sun_path, (tmp + "/" MAIN_SOCKET).data());
+ const char *tmp = get_magisk_tmp();
+ ssprintf(addr.sun_path, sizeof(addr.sun_path), "%s/" MAIN_SOCKET, tmp);
if (connect(fd, (sockaddr *) &addr, sizeof(addr))) {
if (!create || getuid() != AID_ROOT) {
LOGE("No daemon is currently running!\n");
@@ -441,7 +449,7 @@ int connect_daemon(int req, bool create) {
char buf[64];
xreadlink("/proc/self/exe", buf, sizeof(buf));
- if (tmp.empty() || !str_starts(buf, tmp)) {
+ if (tmp[0] == '\0' || !str_starts(buf, tmp)) {
LOGE("Start daemon on magisk tmpfs\n");
close(fd);
return -1;
diff --git a/native/src/core/daemon.rs b/native/src/core/daemon.rs
index 14bb6602edab..47cffb30fe23 100644
--- a/native/src/core/daemon.rs
+++ b/native/src/core/daemon.rs
@@ -1,22 +1,39 @@
-use std::cell::RefCell;
use std::fs::File;
use std::io;
use std::sync::{Mutex, OnceLock};
-use crate::get_prop;
use base::{cstr, Directory, ResultExt, Utf8CStr, Utf8CStrBuf, Utf8CStrBufRef, WalkResult};
-use crate::logging::{magisk_logging, zygisk_logging};
+use crate::get_prop;
+use crate::logging::magisk_logging;
// Global magiskd singleton
pub static MAGISKD: OnceLock = OnceLock::new();
#[derive(Default)]
pub struct MagiskD {
- pub logd: Mutex>>,
+ pub logd: Mutex