From 991a592df94e34df0be1030d19f6740e0272dcf9 Mon Sep 17 00:00:00 2001 From: krishpranav Date: Sat, 11 Apr 2026 17:08:12 +0530 Subject: [PATCH 1/3] tauri-runtime-wry: avoid leaking ObjC retains in with_webview WebviewMessage::WithWebview converted Retained values to raw pointers with Retained::into_raw on Apple targets, transferring ownership without a corresponding release in this path. Use scoped Retained bindings and Retained::as_ptr for pointer handoff to the callback payload. This preserves borrowing semantics for callback lifetime and keeps Objective-C retain/release balanced when the retained values drop after callback return. Fixes #15210 --- crates/tauri-runtime-wry/src/lib.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/tauri-runtime-wry/src/lib.rs b/crates/tauri-runtime-wry/src/lib.rs index 772c392a2632..f50f58ff4068 100644 --- a/crates/tauri-runtime-wry/src/lib.rs +++ b/crates/tauri-runtime-wry/src/lib.rs @@ -3990,25 +3990,28 @@ fn handle_user_message( #[cfg(target_os = "macos")] { use wry::WebViewExtMacOS; + let platform_webview = webview.webview(); + let manager = webview.manager(); + let ns_window = webview.ns_window(); f(Webview { - webview: Retained::into_raw(webview.webview()) as *mut objc2::runtime::AnyObject + webview: Retained::as_ptr(&platform_webview) as *const std::ffi::c_void as *mut std::ffi::c_void, - manager: Retained::into_raw(webview.manager()) as *mut objc2::runtime::AnyObject + manager: Retained::as_ptr(&manager) as *const std::ffi::c_void as *mut std::ffi::c_void, - ns_window: Retained::into_raw(webview.ns_window()) as *mut objc2::runtime::AnyObject + ns_window: Retained::as_ptr(&ns_window) as *const std::ffi::c_void as *mut std::ffi::c_void, }); } #[cfg(target_os = "ios")] { use wry::WebViewExtIOS; + let platform_webview = webview.inner.webview(); + let manager = webview.inner.manager(); f(Webview { - webview: Retained::into_raw(webview.inner.webview()) - as *mut objc2::runtime::AnyObject + webview: Retained::as_ptr(&platform_webview) as *const std::ffi::c_void as *mut std::ffi::c_void, - manager: Retained::into_raw(webview.inner.manager()) - as *mut objc2::runtime::AnyObject + manager: Retained::as_ptr(&manager) as *const std::ffi::c_void as *mut std::ffi::c_void, view_controller: window.ui_view_controller(), }); From 5a39d46881a5f68b4be622f3149600b691a5cc4c Mon Sep 17 00:00:00 2001 From: krishpranav Date: Sat, 11 Apr 2026 17:16:18 +0530 Subject: [PATCH 2/3] chore: add changes file for #15210 --- .changes/fix-objc-retain-leak.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/fix-objc-retain-leak.md diff --git a/.changes/fix-objc-retain-leak.md b/.changes/fix-objc-retain-leak.md new file mode 100644 index 000000000000..9c5893821e77 --- /dev/null +++ b/.changes/fix-objc-retain-leak.md @@ -0,0 +1 @@ +patch tauri-runtime-wry From 4c284119030803a1bb44549b2e4016e81f1184cf Mon Sep 17 00:00:00 2001 From: krishpranav Date: Sat, 11 Apr 2026 18:55:25 +0530 Subject: [PATCH 3/3] changes: fix covector metadata for objc leak patch Format .changes/fix-objc-retain-leak.md with valid covector front matter and package bump metadata. This resolves CI failures in check-change-tags and covector status for this PR. --- .changes/fix-objc-retain-leak.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.changes/fix-objc-retain-leak.md b/.changes/fix-objc-retain-leak.md index 9c5893821e77..0c4951ab1db7 100644 --- a/.changes/fix-objc-retain-leak.md +++ b/.changes/fix-objc-retain-leak.md @@ -1 +1,5 @@ -patch tauri-runtime-wry +--- +"tauri-runtime-wry": patch:bug +--- + +Avoid leaking Objective-C objects in `WebviewMessage::WithWebview` on Apple targets by replacing `Retained::into_raw` with scoped retained bindings and `Retained::as_ptr` pointer handoff.