Compare commits

..

11 Commits
v30.3 ... v30.4

Author SHA1 Message Date
topjohnwu
c3db2e368d Release Magisk v30.4
[skip ci]
2025-10-02 04:30:47 -07:00
topjohnwu
d37da5ca66 Cleanup code 2025-10-02 04:18:20 -07:00
topjohnwu
aac52176ed Support API level as floating point 2025-10-02 04:10:22 -07:00
topjohnwu
78e2fc37e5 Add easy knobs to disable security checks 2025-10-02 04:09:46 -07:00
Wang Han
ca2e40593f Make fetchUpdate safe 2025-10-02 04:03:44 -07:00
LoveSy
c07fdc87e3 Handle second splice() failure gracefully 2025-10-02 04:03:27 -07:00
topjohnwu
7270f5e413 Several minor fixes/improvements 2025-10-02 04:03:08 -07:00
topjohnwu
07cc85ccb1 Default initialize before swap in move constructor
Fix #9373, fix #9384, fix #9400, fix #9404
2025-10-02 04:03:08 -07:00
topjohnwu
d6f17c42d5 Fix logging implementation error 2025-10-02 04:03:08 -07:00
Wang Han
d60806f429 Only reset NB prop when zygisk is enabled 2025-10-02 03:19:32 -07:00
Mohammad Hasan Keramat J
8836a09c8c core: Update Persian translation 2025-09-30 00:21:44 -07:00
19 changed files with 141 additions and 51 deletions

View File

@@ -73,7 +73,8 @@ class InstallViewModel(svc: NetworkService, markwon: Markwon) : BaseViewModel()
val noteText = when { val noteText = when {
noteFile.exists() -> noteFile.readText() noteFile.exists() -> noteFile.readText()
else -> { else -> {
val note = svc.fetchUpdate(APP_VERSION_CODE).note val note = svc.fetchUpdate(APP_VERSION_CODE)?.note.orEmpty()
if (note.isEmpty()) return@launch
noteFile.writeText(note) noteFile.writeText(note)
note note
} }

View File

@@ -41,7 +41,9 @@ class NetworkService(
info info
} }
suspend fun fetchUpdate(version: Int) = findRelease { it.versionCode == version }.asInfo() suspend fun fetchUpdate(version: Int) = safe {
findRelease { it.versionCode == version }.asInfo()
}
// Keep going through all release pages until we find a match // Keep going through all release pages until we find a match
private suspend inline fun findRelease(predicate: (Release) -> Boolean): Release? { private suspend inline fun findRelease(predicate: (Release) -> Boolean): Release? {

View File

@@ -8,6 +8,7 @@
<string name="install">نصب</string> <string name="install">نصب</string>
<string name="section_home">خانه</string> <string name="section_home">خانه</string>
<string name="section_theme">تم ها</string> <string name="section_theme">تم ها</string>
<string name="denylist">لیست منع</string>
<!--Home--> <!--Home-->
<string name="no_connection">هیچ اتصالی وجود ندارد</string> <string name="no_connection">هیچ اتصالی وجود ندارد</string>
@@ -17,7 +18,9 @@
<string name="not_available">غیر/قابل دسترسی</string> <string name="not_available">غیر/قابل دسترسی</string>
<string name="hide">پنهان کردن</string> <string name="hide">پنهان کردن</string>
<string name="home_package">پکیج</string> <string name="home_package">پکیج</string>
<string name="home_app_title">برنامه</string>
<string name="home_notice_content">Magisk را فقط از صفحه رسمی GitHub دانلود کنید. فایل‌ها از منابع ناشناس می‌توانند مخرب باشند!</string>
<string name="home_follow_title">ما را دنبال کنید</string>
<string name="home_support_title">حمایت ما</string> <string name="home_support_title">حمایت ما</string>
<string name="home_item_source">منبع</string> <string name="home_item_source">منبع</string>
<string name="home_support_content">این برنامه (Magisk) رایگان و متن باز است و همیشه خواهد ماند. اگرچه شما میتواند با دونیت خود نشان دهد که به ما اهمیت می دهید.</string> <string name="home_support_content">این برنامه (Magisk) رایگان و متن باز است و همیشه خواهد ماند. اگرچه شما میتواند با دونیت خود نشان دهد که به ما اهمیت می دهید.</string>
@@ -47,8 +50,10 @@
<!--Superuser--> <!--Superuser-->
<string name="su_request_title">درخواست کاربر روت</string> <string name="su_request_title">درخواست کاربر روت</string>
<string name="touch_filtered_warning">به دلیل اینکه یک برنامه در حال پوشاندن درخواست Superuser است، Magisk نمی‌تواند پاسخ شما را تأیید کند.</string>
<string name="deny">رد کردن</string> <string name="deny">رد کردن</string>
<string name="prompt">درخواست کردن</string> <string name="prompt">درخواست کردن</string>
<string name="restrict">محدود کردن</string>
<string name="grant">اجازه دادن</string> <string name="grant">اجازه دادن</string>
<string name="su_warning">دسترسی کامل به دستگاه شما را اعطا می کند. \nاگر مطمئن نیستید رد کنید!</string> <string name="su_warning">دسترسی کامل به دستگاه شما را اعطا می کند. \nاگر مطمئن نیستید رد کنید!</string>
<string name="forever">همیشه</string> <string name="forever">همیشه</string>
@@ -67,37 +72,50 @@
<string name="su_snack_log_off">ورود به سیستم از %1$s غییر فعال است</string> <string name="su_snack_log_off">ورود به سیستم از %1$s غییر فعال است</string>
<string name="su_revoke_title">باطل بشه؟</string> <string name="su_revoke_title">باطل بشه؟</string>
<string name="su_revoke_msg">تایید کنید که %1$s باطل بشه؟</string> <string name="su_revoke_msg">تایید کنید که %1$s باطل بشه؟</string>
<string name="toast">پیام کوتاه</string>
<string name="none">هیچ کدام</string> <string name="none">هیچ کدام</string>
<string name="superuser_toggle_notification">اعلان ها</string> <string name="superuser_toggle_notification">اعلان ها</string>
<string name="superuser_toggle_revoke">ابطال</string> <string name="superuser_toggle_revoke">ابطال</string>
<string name="superuser_policy_none">هنوز هیچ برنامه ای مجوز روت درخواست نکرده است.</string> <string name="superuser_policy_none">هنوز هیچ برنامه ای مجوز روت درخواست نکرده است.</string>
<!--Logs--> <!--Logs-->
<string name="log_data_none">شما هیچ لاگی ندارید, سعی کنید برنامه های که به روت دسترسی میگیرند را استفاده کنید.</string> <string name="log_data_none">شما هیچ لاگی ندارید, سعی کنید برنامه های که به روت دسترسی میگیرند را استفاده کنید.</string>
<string name="log_data_magisk_none">لاگ های مربوط به Magisk خالی است. پنا بر خدا.</string> <string name="log_data_magisk_none">لاگ های مربوط به Magisk خالی است.</string>
<string name="menuSaveLog">ذخیره کردن لاگ</string> <string name="menuSaveLog">ذخیره کردن لاگ</string>
<string name="menuClearLog">پاک کردن لاگ</string> <string name="menuClearLog">پاک کردن لاگ</string>
<string name="logs_cleared">لاگ با موفقیت پاک شد.</string> <string name="logs_cleared">لاگ با موفقیت پاک شد.</string>
<string name="pid">شناسه پردازش: %1$d</string>
<!--SafetyNet--> <string name="target_uid">شناسه کاربر هدف: %1$d</string>
<string name="target_pid">شناسه پردازش هدف: %s</string>
<string name="selinux_context">متن SELinux: %s</string>
<string name="supp_group">گروه تکمیلی: %s</string>
<!-- MagiskHide --> <!-- MagiskHide -->
<string name="show_system_app">نشان دادن برنامه های سیستمی</string> <string name="show_system_app">نشان دادن برنامه های سیستمی</string>
<string name="show_os_app">نمایش برنامه‌های سیستم عامل</string>
<string name="hide_filter_hint">فیلتر کردن با نام</string> <string name="hide_filter_hint">فیلتر کردن با نام</string>
<string name="hide_search">سرچ کردن</string> <string name="hide_search">سرچ کردن</string>
<!--Module --> <!--Module -->
<string name="no_info_provided">(هیچ اطلاعاتی ارائه نشده است)</string> <string name="no_info_provided">(هیچ اطلاعاتی ارائه نشده است)</string>
<string name="reboot_userspace">راه اندازی مججد</string>
<string name="reboot_recovery">راه اندازی مججد برای رفتن به ریکاوری</string> <string name="reboot_recovery">راه اندازی مججد برای رفتن به ریکاوری</string>
<string name="reboot_bootloader">راه اندازی مججد برای رفتن به بوت لودر</string> <string name="reboot_bootloader">راه اندازی مججد برای رفتن به بوت لودر</string>
<string name="reboot_download">راه اندازی مججد برای دانلود کردن</string> <string name="reboot_download">راه اندازی مججد برای دانلود کردن</string>
<string name="reboot_edl">راه اندازی مججد برای رفتن به EDL</string> <string name="reboot_edl">راه اندازی مججد برای رفتن به EDL</string>
<string name="reboot_safe_mode">راه اندازی مججد برای رفتن به حالت امن</string>
<string name="module_version_author">%1$s با %2$s</string> <string name="module_version_author">%1$s با %2$s</string>
<string name="module_state_remove">حذف کردن</string> <string name="module_state_remove">حذف کردن</string>
<string name="module_state_restore">بازگرداندن</string> <string name="module_state_restore">بازگرداندن</string>
<string name="module_action_install_external">نصب از حافظه</string> <string name="module_action_install_external">نصب از حافظه</string>
<string name="update_available">بروزرسانی در دسترس است</string> <string name="update_available">بروزرسانی در دسترس است</string>
<string name="suspend_text_riru">ماژول به دلیل فعال بودن %1$s متوقف شد</string>
<string name="suspend_text_zygisk">ماژول به دلیل غیرفعال بودن %1$s متوقف شد</string>
<string name="zygisk_module_unloaded">ماژول Zygisk به دلیل ناسازگاری بارگذاری نشد</string>
<string name="module_empty">هیچ ماژولی نصب نشده است</string>
<string name="confirm_install">نصب ماژول %1$s؟</string>
<string name="confirm_install_title">تأیید نصب</string>
<!--Settings --> <!--Settings -->
<string name="settings_dark_mode_title">حالت تم</string> <string name="settings_dark_mode_title">حالت تم</string>
@@ -107,6 +125,10 @@
<string name="settings_dark_mode_dark">همیشه تاریک</string> <string name="settings_dark_mode_dark">همیشه تاریک</string>
<string name="settings_download_path_title">مسیر دانلود</string> <string name="settings_download_path_title">مسیر دانلود</string>
<string name="settings_download_path_message">فایل ها در %1$s ذخیره خواهند شد.</string> <string name="settings_download_path_message">فایل ها در %1$s ذخیره خواهند شد.</string>
<string name="settings_hide_app_title">مخفی کردن برنامه Magisk</string>
<string name="settings_hide_app_summary">نصب یک برنامه پروکسی با شناسه بسته تصادفی و برچسب سفارشی</string>
<string name="settings_restore_app_title">بازگردانی برنامه Magisk</string>
<string name="settings_restore_app_summary">آشکار کردن برنامه و بازگرداندن APK اصلی</string>
<string name="language">زبان</string> <string name="language">زبان</string>
<string name="system_default">(پیش فرض سیستم)</string> <string name="system_default">(پیش فرض سیستم)</string>
<string name="settings_check_update_title">چک کردن بروز رسانی ها</string> <string name="settings_check_update_title">چک کردن بروز رسانی ها</string>
@@ -114,8 +136,14 @@
<string name="settings_update_channel_title">کانال بروزرسانی</string> <string name="settings_update_channel_title">کانال بروزرسانی</string>
<string name="settings_update_stable">پایدار</string> <string name="settings_update_stable">پایدار</string>
<string name="settings_update_beta">آزمایشی</string> <string name="settings_update_beta">آزمایشی</string>
<string name="settings_update_debug">اشکال‌زدایی</string>
<string name="settings_update_custom">شخصی سازی شده</string> <string name="settings_update_custom">شخصی سازی شده</string>
<string name="settings_update_custom_msg">اضافه کردن یک URL سفارشی</string> <string name="settings_update_custom_msg">اضافه کردن یک URL سفارشی</string>
<string name="settings_zygisk_summary">اجرای بخش‌هایی از Magisk در سرویس Zygote</string>
<string name="settings_denylist_title">اعمال لیست منع</string>
<string name="settings_denylist_summary">فرآیندهای موجود در لیست منع تمام تغییرات Magisk را از دست خواهند داد</string>
<string name="settings_denylist_config_title">پیکربندی لیست منع</string>
<string name="settings_denylist_config_summary">انتخاب فرآیندهایی که باید در لیست منع قرار گیرند</string>
<string name="settings_hosts_title">نصب بدون حذف یا تغییر در فایل ها</string> <string name="settings_hosts_title">نصب بدون حذف یا تغییر در فایل ها</string>
<string name="settings_hosts_summary">نصب بدون حذف یا تغییر در فایل ها رای ساپورت از برنامه های Adblock</string> <string name="settings_hosts_summary">نصب بدون حذف یا تغییر در فایل ها رای ساپورت از برنامه های Adblock</string>
<string name="settings_hosts_toast">ماژول نصب بدون حذف یا تغییر در فایل ها اضافه شد</string> <string name="settings_hosts_toast">ماژول نصب بدون حذف یا تغییر در فایل ها اضافه شد</string>
@@ -138,9 +166,19 @@
<string name="superuser_notification">اعلان روت</string> <string name="superuser_notification">اعلان روت</string>
<string name="settings_su_reauth_title">احراز هویت دوباره پس از بروز رسانی</string> <string name="settings_su_reauth_title">احراز هویت دوباره پس از بروز رسانی</string>
<string name="settings_su_reauth_summary">تأیید کردندوباره مجوزهای روت پس از ارتقاء برنامه</string> <string name="settings_su_reauth_summary">تأیید کردندوباره مجوزهای روت پس از ارتقاء برنامه</string>
<string name="settings_su_tapjack_title">محافظت در برابر Tapjacking</string>
<string name="settings_su_tapjack_summary">پنجره درخواست Superuser زمانی که توسط پنجره یا لایه دیگری پوشانده شود، به ورودی پاسخ نخواهد داد</string>
<string name="settings_su_auth_title">احراز هویت کاربر</string>
<string name="settings_su_auth_summary">درخواست احراز هویت کاربر هنگام درخواست Superuser</string>
<string name="settings_su_auth_insecure">هیچ روش احراز هویتی روی دستگاه پیکربندی نشده است</string>
<string name="settings_su_restrict_title">محدود کردن دسترسی روت</string>
<string name="settings_su_restrict_summary">به طور پیش‌فرض برنامه‌های Superuser جدید را محدود می‌کند. هشدار: این کار بیشتر برنامه‌ها را از کار می‌اندازد. فقط اگر دقیقاً می‌دانید چه می‌کنید آن را فعال کنید.</string>
<string name="settings_customization">سفارشی سازی</string> <string name="settings_customization">سفارشی سازی</string>
<string name="setting_add_shortcut_summary">اضافه کردن یک میانبر زیبا را در صفحه اصلی در صورت شناسایی نام و نماد پس از پنهان کردن برنامه</string> <string name="setting_add_shortcut_summary">اضافه کردن یک میانبر زیبا را در صفحه اصلی در صورت شناسایی نام و نماد پس از پنهان کردن برنامه</string>
<string name="settings_doh_title">DNS روی HTTPS</string>
<string name="settings_doh_description">دور زدن مسمومیت DNS در برخی کشورها</string>
<string name="settings_random_name_title">تغییر تصادفی نام خروجی</string>
<string name="settings_random_name_description">تغییر تصادفی نام فایل خروجی تصاویر و فایل‌های tar پچ‌شده برای جلوگیری از شناسایی</string>
<string name="multiuser_mode">حالت چند کاربره</string> <string name="multiuser_mode">حالت چند کاربره</string>
<string name="settings_owner_only">فقط صاحب دستگاه</string> <string name="settings_owner_only">فقط صاحب دستگاه</string>
<string name="settings_owner_manage">صاحب دستگاه مدیریت شود</string> <string name="settings_owner_manage">صاحب دستگاه مدیریت شود</string>
@@ -148,7 +186,6 @@
<string name="owner_only_summary">فقط مالک دسترسی روت دارد</string> <string name="owner_only_summary">فقط مالک دسترسی روت دارد</string>
<string name="owner_manage_summary">فقط مالک می تواند دسترسی روت را مدیریت کرده و درخواست های پرامپت را دریافت کند</string> <string name="owner_manage_summary">فقط مالک می تواند دسترسی روت را مدیریت کرده و درخواست های پرامپت را دریافت کند</string>
<string name="user_independent_summary">هر کاربر قوانین روت جداگانه خود را دارد</string> <string name="user_independent_summary">هر کاربر قوانین روت جداگانه خود را دارد</string>
<string name="mount_namespace_mode">نصب کردن Namespace Mode</string> <string name="mount_namespace_mode">نصب کردن Namespace Mode</string>
<string name="settings_ns_global">سراسری Namespace</string> <string name="settings_ns_global">سراسری Namespace</string>
<string name="settings_ns_requester">وراثتی Namespace</string> <string name="settings_ns_requester">وراثتی Namespace</string>
@@ -160,19 +197,27 @@
<!--Notifications--> <!--Notifications-->
<string name="update_channel">Magisk بروزرسانی های</string> <string name="update_channel">Magisk بروزرسانی های</string>
<string name="progress_channel">اعلان پیشرفت</string> <string name="progress_channel">اعلان پیشرفت</string>
<string name="updated_channel">به‌روزرسانی کامل شد</string>
<string name="download_complete">دانلود کامل شد</string> <string name="download_complete">دانلود کامل شد</string>
<string name="download_file_error">خطا در دانلود فایل</string> <string name="download_file_error">خطا در دانلود فایل</string>
<string name="magisk_update_title">بروزرسانی Magisk در دسترس است!</string> <string name="magisk_update_title">بروزرسانی Magisk در دسترس است!</string>
<string name="updated_title">Magisk به‌روزرسانی شد</string>
<string name="updated_text">برای باز کردن برنامه لمس کنید</string>
<!--Toasts, Dialogs--> <!--Toasts, Dialogs-->
<string name="yes">بله</string> <string name="yes">بله</string>
<string name="no">نه</string> <string name="no">نه</string>
<string name="download">انلود کردن</string> <string name="repo_install_title">نصب %1$s %2$s(%3$d)</string>
<string name="download">دانلود کردن</string>
<string name="reboot">راه اندازی مجدد</string> <string name="reboot">راه اندازی مجدد</string>
<string name="close">بستن</string>
<string name="release_notes">نکته های نسخه</string> <string name="release_notes">نکته های نسخه</string>
<string name="flashing">ر حال فلش کردن…</string> <string name="flashing">ر حال فلش کردن…</string>
<string name="running">در حال اجرا…</string>
<string name="done">تمام!</string> <string name="done">تمام!</string>
<string name="done_action">انجام عملیات %1$s به پایان رسید</string>
<string name="failure">ناموفق</string> <string name="failure">ناموفق</string>
<string name="hide_app_title">در حال مخفی کردن برنامه Magisk…</string>
<string name="open_link_failed_toast">هیچ برنامه ای برای باز کردن لینک یافت نشد</string> <string name="open_link_failed_toast">هیچ برنامه ای برای باز کردن لینک یافت نشد</string>
<string name="complete_uninstall">کامل کردن حذف</string> <string name="complete_uninstall">کامل کردن حذف</string>
<string name="restore_img">بازیابی تصاویر</string> <string name="restore_img">بازیابی تصاویر</string>
@@ -181,9 +226,24 @@
<string name="restore_fail">نسخه پشتیبان استک موجود نیست!</string> <string name="restore_fail">نسخه پشتیبان استک موجود نیست!</string>
<string name="setup_fail">نصب انجام نشد</string> <string name="setup_fail">نصب انجام نشد</string>
<string name="env_fix_title">به تنظیمات اضافی نیاز دارد</string> <string name="env_fix_title">به تنظیمات اضافی نیاز دارد</string>
<string name="env_fix_msg">دستگاه شما به پیکربندی اضافی نیاز دارد تا Magisk به درستی کار کند. آیا می‌خواهید ادامه دهید و راه‌اندازی مجدد انجام شود؟</string>
<string name="env_full_fix_msg">دستگاه شما نیاز به نصب دوباره Magisk دارد تا به درستی کار کند. لطفاً Magisk را از داخل برنامه دوباره نصب کنید، حالت Recovery نمی‌تواند اطلاعات دستگاه را به درستی بگیرد.</string>
<string name="setup_msg">راه اندازی محیط نصب…</string> <string name="setup_msg">راه اندازی محیط نصب…</string>
<string name="unsupport_magisk_title">نسخه پشتیبانی نشده Magisk</string> <string name="unsupport_magisk_title">نسخه پشتیبانی نشده Magisk</string>
<string name="unsupport_magisk_msg">این نسخه از برنامه از نسخه‌های Magisk پایین‌تر از %1$s پشتیبانی نمی‌کند.\n\nبرنامه طوری رفتار می‌کند که انگار Magisk نصب نشده است. لطفاً هرچه سریع‌تر Magisk را به‌روزرسانی کنید.</string>
<string name="unsupport_general_title">وضعیت غیرعادی</string>
<string name="unsupport_system_app_msg">اجرای این برنامه به عنوان برنامه سیستمی پشتیبانی نمی‌شود. لطفاً آن را به برنامه کاربری بازگردانید.</string>
<string name="unsupport_other_su_msg">یک باینری "su" غیر از Magisk شناسایی شد. لطفاً هر راهکار روت دیگری را حذف کنید و/یا Magisk را دوباره نصب کنید.</string>
<string name="unsupport_external_storage_msg">Magisk روی حافظه خارجی نصب شده است. لطفاً برنامه را به حافظه داخلی منتقل کنید.</string>
<string name="unsupport_nonroot_stub_msg">برنامه مخفی Magisk نمی‌تواند ادامه دهد زیرا دسترسی روت از بین رفته است. لطفاً APK اصلی را بازگردانید.</string>
<string name="unsupport_nonroot_stub_title">@string/settings_restore_app_title</string>
<string name="external_rw_permission_denied">برای فعال کردن این قابلیت ، اجازه دسترسی به حافظه بدهید</string> <string name="external_rw_permission_denied">برای فعال کردن این قابلیت ، اجازه دسترسی به حافظه بدهید</string>
<string name="post_notifications_denied">برای فعال‌سازی این قابلیت، مجوز اعلان‌ها را بدهید</string>
<string name="install_unknown_denied">برای فعال‌سازی این قابلیت، «نصب برنامه‌های ناشناخته» را مجاز کنید</string>
<string name="add_shortcut_title">اضافه کردن میانبر را به صفحه</string> <string name="add_shortcut_title">اضافه کردن میانبر را به صفحه</string>
<string name="add_shortcut_msg">بعد از مخفی کردن این برنامه، ممکن است نام و آیکون آن سخت قابل شناسایی شود. آیا می‌خواهید یک میانبر زیبا به صفحه اصلی اضافه کنید؟</string>
<string name="app_not_found">هیچ برنامه‌ای برای انجام این عملیات یافت نشد</string>
<string name="reboot_apply_change">برای اعمال تغییرات، دستگاه را دوباره راه‌اندازی کنید</string>
<string name="restore_app_confirmation">این کار برنامه مخفی شده را به نسخه اصلی بازمی‌گرداند. آیا واقعاً می‌خواهید این کار را انجام دهید؟</string>
</resources> </resources>

View File

@@ -30,4 +30,4 @@ android.nonFinalResIds=false
# Magisk # Magisk
magisk.stubVersion=40 magisk.stubVersion=40
magisk.versionCode=30300 magisk.versionCode=30400

View File

@@ -1,5 +1,9 @@
# Magisk Changelog # Magisk Changelog
### v30.4 (2025.10.2)
- [MagiskSU] Fix several implementation bugs
### v30.3 (2025.9.29) ### v30.3 (2025.9.29)
- [General] Support installing Magisk into vendor_boot partition - [General] Support installing Magisk into vendor_boot partition

View File

@@ -10,6 +10,7 @@
#include <string> #include <string>
#include <base.hpp> #include <base.hpp>
#include <flags.h>
using namespace std; using namespace std;

View File

@@ -13,6 +13,7 @@ struct mmap_data : public byte_data {
(sizeof(void *) == 4 && BLKGETSIZE64 == 0x80041272)); (sizeof(void *) == 4 && BLKGETSIZE64 == 0x80041272));
ALLOW_MOVE_ONLY(mmap_data) ALLOW_MOVE_ONLY(mmap_data)
mmap_data() = default;
explicit mmap_data(const char *name, bool rw = false); explicit mmap_data(const char *name, bool rw = false);
mmap_data(int dirfd, const char *name, bool rw = false); mmap_data(int dirfd, const char *name, bool rw = false);
mmap_data(int fd, size_t sz, bool rw = false); mmap_data(int fd, size_t sz, bool rw = false);

View File

@@ -76,7 +76,7 @@ fn log_with_writer<F: FnOnce(LogWriter)>(level: LogLevel, f: F) {
return; return;
} }
f(logger.write); f(logger.write);
if logger.flags.contains(LogFlag::EXIT_ON_ERROR) { if matches!(level, LogLevel::Error) && logger.flags.contains(LogFlag::EXIT_ON_ERROR) {
exit(-1); exit(-1);
} }
} }

View File

@@ -15,7 +15,7 @@ clazz(clazz &&) = delete;
#define ALLOW_MOVE_ONLY(clazz) \ #define ALLOW_MOVE_ONLY(clazz) \
clazz(const clazz&) = delete; \ clazz(const clazz&) = delete; \
clazz(clazz &&o) { swap(o); } \ clazz(clazz &&o) : clazz() { swap(o); } \
clazz& operator=(clazz &&o) { swap(o); return *this; } clazz& operator=(clazz &&o) { swap(o); return *this; }
struct Utf8CStr; struct Utf8CStr;

View File

@@ -8,8 +8,12 @@ crate-type = ["staticlib"]
path = "lib.rs" path = "lib.rs"
[features] [features]
default = ["check-signature"] default = ["check-signature", "check-client", "su-check-db"]
# Disable these features for easier debugging during development
check-signature = [] check-signature = []
check-client = []
su-check-db = []
[build-dependencies] [build-dependencies]
cxx-gen = { workspace = true } cxx-gen = { workspace = true }

View File

@@ -75,8 +75,8 @@ impl MagiskD {
let tmp_bb = buf.append_path(get_magisk_tmp()).append_path(BBPATH); let tmp_bb = buf.append_path(get_magisk_tmp()).append_path(BBPATH);
tmp_bb.mkdirs(0o755).ok(); tmp_bb.mkdirs(0o755).ok();
tmp_bb.append_path("busybox"); tmp_bb.append_path("busybox");
tmp_bb.follow_link().chmod(0o755).log_ok();
busybox.copy_to(tmp_bb).ok(); busybox.copy_to(tmp_bb).ok();
tmp_bb.follow_link().chmod(0o755).log_ok();
// Install busybox applets // Install busybox applets
Command::new(&tmp_bb) Command::new(&tmp_bb)
@@ -185,8 +185,10 @@ impl MagiskD {
setup_preinit_dir(); setup_preinit_dir();
self.ensure_manager(); self.ensure_manager();
if self.zygisk_enabled.load(Ordering::Relaxed) {
self.zygisk.lock().unwrap().reset(true); self.zygisk.lock().unwrap().reset(true);
} }
}
pub fn boot_stage_handler(&self, client: UnixStream, code: RequestCode) { pub fn boot_stage_handler(&self, client: UnixStream, code: RequestCode) {
// Make sure boot stage execution is always serialized // Make sure boot stage execution is always serialized

View File

@@ -33,7 +33,7 @@ use std::io::{BufReader, Write};
use std::os::fd::{AsFd, AsRawFd, IntoRawFd, RawFd}; use std::os::fd::{AsFd, AsRawFd, IntoRawFd, RawFd};
use std::os::unix::net::{UCred, UnixListener, UnixStream}; use std::os::unix::net::{UCred, UnixListener, UnixStream};
use std::process::{Command, exit}; use std::process::{Command, exit};
use std::sync::atomic::AtomicBool; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Mutex, OnceLock}; use std::sync::{Mutex, OnceLock};
use std::time::Duration; use std::time::Duration;
@@ -130,8 +130,10 @@ impl MagiskD {
info!("** zygote restarted"); info!("** zygote restarted");
self.prune_su_access(); self.prune_su_access();
scan_deny_apps(); scan_deny_apps();
if self.zygisk_enabled.load(Ordering::Relaxed) {
self.zygisk.lock().unwrap().reset(false); self.zygisk.lock().unwrap().reset(false);
} }
}
RequestCode::SQLITE_CMD => { RequestCode::SQLITE_CMD => {
self.db_exec_for_cli(client).ok(); self.db_exec_for_cli(client).ok();
} }
@@ -159,6 +161,7 @@ impl MagiskD {
.ok(); .ok();
} }
#[cfg(feature = "check-client")]
fn is_client(&self, pid: i32) -> bool { fn is_client(&self, pid: i32) -> bool {
let mut buf = cstr::buf::new::<32>(); let mut buf = cstr::buf::new::<32>();
write!(buf, "/proc/{pid}/exe").ok(); write!(buf, "/proc/{pid}/exe").ok();
@@ -169,6 +172,11 @@ impl MagiskD {
} }
} }
#[cfg(not(feature = "check-client"))]
fn is_client(&self, pid: i32) -> bool {
true
}
fn handle_requests(&'static self, mut client: UnixStream) { fn handle_requests(&'static self, mut client: UnixStream) {
let Ok(cred) = client.peer_cred() else { let Ok(cred) = client.peer_cred() else {
// Client died // Client died

View File

@@ -2,7 +2,7 @@ use crate::consts::{LOG_PIPE, LOGFILE};
use crate::ffi::get_magisk_tmp; use crate::ffi::get_magisk_tmp;
use crate::logging::LogFile::{Actual, Buffer}; use crate::logging::LogFile::{Actual, Buffer};
use base::{ use base::{
FsPathBuilder, LogLevel, LoggedResult, ReadExt, Utf8CStr, Utf8CStrBuf, WriteExt, FsPathBuilder, LogLevel, LoggedResult, ReadExt, ResultExt, Utf8CStr, Utf8CStrBuf, WriteExt,
const_format::concatcp, cstr, libc, new_daemon_thread, raw_cstr, update_logger, const_format::concatcp, cstr, libc, new_daemon_thread, raw_cstr, update_logger,
}; };
use bytemuck::{Pod, Zeroable, bytes_of, write_zeroes}; use bytemuck::{Pod, Zeroable, bytes_of, write_zeroes};
@@ -328,7 +328,7 @@ pub fn start_log_daemon() {
} }
let _: LoggedResult<()> = try { let _: LoggedResult<()> = try {
path.mkfifo(0o666)?; path.mkfifo(0o666).log_ok();
chown(path.as_utf8_cstr(), Some(Uid::from(0)), Some(Gid::from(0)))?; chown(path.as_utf8_cstr(), Some(Uid::from(0)), Some(Gid::from(0)))?;
let read = path.open(OFlag::O_RDWR | OFlag::O_CLOEXEC)?; let read = path.open(OFlag::O_RDWR | OFlag::O_CLOEXEC)?;
let write = path.open(OFlag::O_WRONLY | OFlag::O_CLOEXEC)?; let write = path.open(OFlag::O_WRONLY | OFlag::O_CLOEXEC)?;

View File

@@ -212,6 +212,7 @@ impl MagiskD {
info info
} }
#[cfg(feature = "su-check-db")]
fn build_su_info(&self, uid: i32) -> Arc<SuInfo> { fn build_su_info(&self, uid: i32) -> Arc<SuInfo> {
let result: LoggedResult<Arc<SuInfo>> = try { let result: LoggedResult<Arc<SuInfo>> = try {
let cfg = self.get_db_settings()?; let cfg = self.get_db_settings()?;
@@ -283,4 +284,9 @@ impl MagiskD {
result.unwrap_or(Arc::new(SuInfo::deny(uid))) result.unwrap_or(Arc::new(SuInfo::deny(uid)))
} }
#[cfg(not(feature = "su-check-db"))]
fn build_su_info(&self, uid: i32) -> Arc<SuInfo> {
Arc::new(SuInfo::allow(uid))
}
} }

View File

@@ -11,7 +11,7 @@ use nix::{
use std::fs::File; use std::fs::File;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::mem::MaybeUninit; use std::mem::MaybeUninit;
use std::os::fd::{AsFd, AsRawFd, FromRawFd, OwnedFd, RawFd}; use std::os::fd::{AsFd, AsRawFd, FromRawFd, RawFd};
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
static SHOULD_USE_SPLICE: AtomicBool = AtomicBool::new(true); static SHOULD_USE_SPLICE: AtomicBool = AtomicBool::new(true);
@@ -50,21 +50,25 @@ fn pump_via_copy(mut fd_in: &File, mut fd_out: &File) -> LoggedResult<()> {
Ok(()) Ok(())
} }
fn pump_via_splice(fd_in: &File, fd_out: &File, pipe: &(OwnedFd, OwnedFd)) -> LoggedResult<()> { fn pump_via_splice(fd_in: &File, fd_out: &File, pipe: &(File, File)) -> LoggedResult<()> {
if !SHOULD_USE_SPLICE.load(Ordering::Acquire) { if !SHOULD_USE_SPLICE.load(Ordering::Relaxed) {
return pump_via_copy(fd_in, fd_out); return pump_via_copy(fd_in, fd_out);
} }
// The pipe capacity is by default 16 pages, let's just use 65536 // The pipe capacity is by default 16 pages, let's just use 65536
let Ok(len) = splice(fd_in, &pipe.1, 65536) else { let Ok(len) = splice(fd_in, &pipe.1, 65536) else {
// If splice failed, stop using splice and fallback to userspace copy // If splice failed, stop using splice and fallback to userspace copy
SHOULD_USE_SPLICE.store(false, Ordering::Release); SHOULD_USE_SPLICE.store(false, Ordering::Relaxed);
return pump_via_copy(fd_in, fd_out); return pump_via_copy(fd_in, fd_out);
}; };
if len == 0 { if len == 0 {
return Ok(()); return Ok(());
} }
splice(&pipe.0, fd_out, len)?; if splice(&pipe.0, fd_out, len).is_err() {
// If splice failed, stop using splice and fallback to userspace copy
SHOULD_USE_SPLICE.store(false, Ordering::Relaxed);
return pump_via_copy(&pipe.0, fd_out);
}
Ok(()) Ok(())
} }
@@ -128,6 +132,7 @@ fn pump_tty_impl(ptmx: File, pump_stdin: bool) -> LoggedResult<()> {
// Open a pipe to bypass userspace copy with splice // Open a pipe to bypass userspace copy with splice
let pipe_fd = pipe2(OFlag::O_CLOEXEC).into_os_result("pipe2", None, None)?; let pipe_fd = pipe2(OFlag::O_CLOEXEC).into_os_result("pipe2", None, None)?;
let pipe_fd = (File::from(pipe_fd.0), File::from(pipe_fd.1));
'poll: loop { 'poll: loop {
// Wait for event // Wait for event

View File

@@ -234,14 +234,11 @@ int su_client_main(int argc, char *argv[]) {
if (atty) { if (atty) {
// We need a PTY. Get one. // We need a PTY. Get one.
write_int(fd, 1);
int ptmx = recv_fd(fd); int ptmx = recv_fd(fd);
setup_sighandlers(sighandler); setup_sighandlers(sighandler);
// If stdin is not a tty, and if we pump to ptmx, our process may intercept the input to ptmx and // If stdin is not a tty, and if we pump to ptmx, our process may intercept the input to ptmx and
// output to stdout, which cause the target process lost input. // output to stdout, which cause the target process lost input.
pump_tty(ptmx, atty & ATTY_IN); pump_tty(ptmx, atty & ATTY_IN);
} else {
write_int(fd, 0);
} }
// Get the exit code // Get the exit code
@@ -335,9 +332,10 @@ void exec_root_shell(int client, int pid, SuRequest &req, MntNsMode mode) {
int infd = recv_fd(client); int infd = recv_fd(client);
int outfd = recv_fd(client); int outfd = recv_fd(client);
int errfd = recv_fd(client); int errfd = recv_fd(client);
int ptsfd = -1;
// App need a PTY // App need a PTY
if (read_int(client)) { if (infd < 0 || outfd < 0 || errfd < 0) {
string pts; string pts;
string ptmx; string ptmx;
auto magiskpts = get_magisk_tmp() + "/"s SHELLPTS; auto magiskpts = get_magisk_tmp() + "/"s SHELLPTS;
@@ -370,24 +368,18 @@ void exec_root_shell(int client, int pid, SuRequest &req, MntNsMode mode) {
// Opening the TTY has to occur after the // Opening the TTY has to occur after the
// fork() and setsid() so that it becomes // fork() and setsid() so that it becomes
// our controlling TTY and not the daemon's // our controlling TTY and not the daemon's
int ptsfd = xopen(pts_slave.data(), O_RDWR); ptsfd = xopen(pts_slave.data(), O_RDWR);
if (infd < 0)
infd = ptsfd;
if (outfd < 0)
outfd = ptsfd;
if (errfd < 0)
errfd = ptsfd;
} }
// Swap out stdin, stdout, stderr // Swap out stdin, stdout, stderr
xdup2(infd, STDIN_FILENO); xdup2(infd < 0 ? ptsfd : infd, STDIN_FILENO);
xdup2(outfd, STDOUT_FILENO); xdup2(outfd < 0 ? ptsfd : outfd, STDOUT_FILENO);
xdup2(errfd, STDERR_FILENO); xdup2(errfd < 0 ? ptsfd : errfd, STDERR_FILENO);
close(infd); close(infd);
close(outfd); close(outfd);
close(errfd); close(errfd);
close(ptsfd);
close(client); close(client);
// Handle namespaces // Handle namespaces

View File

@@ -7,6 +7,7 @@
#include <cil/cil.h> #include <cil/cil.h>
#include <base.hpp> #include <base.hpp>
#include <flags.h>
using namespace std; using namespace std;

View File

@@ -86,7 +86,7 @@ resolve_vars() {
# Determine API level # Determine API level
local api local api
case $ver in case $ver in
+([0-9])) api=$ver ;; +([0-9\.])) api=$ver ;;
TiramisuPrivacySandbox) api=33 ;; TiramisuPrivacySandbox) api=33 ;;
UpsideDownCakePrivacySandbox) api=34 ;; UpsideDownCakePrivacySandbox) api=34 ;;
VanillaIceCream) api=35 ;; VanillaIceCream) api=35 ;;
@@ -100,10 +100,10 @@ resolve_vars() {
# Determine default image type # Determine default image type
if [ -z $type ]; then if [ -z $type ]; then
if [ $api -ge $atd_min_api -a $api -le $atd_max_api ]; then if [ $(bc <<< "$api >= $atd_min_api && $api <= $atd_max_api") = 1 ]; then
# Use the lightweight ATD images if possible # Use the lightweight ATD images if possible
type='aosp_atd' type='aosp_atd'
elif [ $api -gt $atd_max_api ]; then elif [ $(bc <<< "$api > $atd_max_api") = 1 ]; then
# Preview/beta release, no AOSP version available # Preview/beta release, no AOSP version available
type='google_apis' type='google_apis'
else else
@@ -113,7 +113,7 @@ resolve_vars() {
# Old Linux kernels will not boot with memory larger than 3GB # Old Linux kernels will not boot with memory larger than 3GB
local memory local memory
if [ $api -lt $huge_ram_min_api ]; then if [ $(bc <<< "$api < $huge_ram_min_api") = 1 ]; then
memory=3072 memory=3072
else else
memory=8192 memory=8192
@@ -169,8 +169,9 @@ test_emu() {
} }
test_main() { test_main() {
local avd_pkg ramdisk local avd_pkg ramdisk vars
eval $(resolve_vars "emu_args avd_pkg ramdisk" $1 $2) vars=$(resolve_vars "emu_args avd_pkg ramdisk" $1 $2)
eval $vars
# Specify an explicit port so that tests can run with other emulators running at the same time # Specify an explicit port so that tests can run with other emulators running at the same time
local emu_port=5682 local emu_port=5682
@@ -216,16 +217,18 @@ test_main() {
} }
run_main() { run_main() {
local avd_pkg local avd_pkg vars
eval $(resolve_vars "emu_args avd_pkg" $1 $2) vars=$(resolve_vars "emu_args avd_pkg" $1 $2)
eval $vars
setup_emu "$avd_pkg" setup_emu "$avd_pkg"
print_title "* Launching $avd_pkg" print_title "* Launching $avd_pkg"
"$emu" @test $emu_args 2>/dev/null "$emu" @test $emu_args 2>/dev/null
} }
dl_main() { dl_main() {
local avd_pkg local avd_pkg vars
eval $(resolve_vars "avd_pkg" $1 $2) vars=$(resolve_vars "avd_pkg" $1 $2)
eval $vars
print_title "* Downloading $avd_pkg" print_title "* Downloading $avd_pkg"
dl_emu "$avd_pkg" dl_emu "$avd_pkg"
} }

View File

@@ -24,7 +24,7 @@ print_title() {
} }
print_error() { print_error() {
echo -e "\n\033[41;39m${1}\033[0m\n" echo -e "\n\033[41;39m${1}\033[0m\n" >&2
} }
# $1 = TestClass#method # $1 = TestClass#method