From 8826fc7382431c993ecd4c1bfbdfc4f768959ae6 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 13 Jun 2025 19:52:23 -0700 Subject: [PATCH] Some simple mitigation against of double release --- .../InvalidationAwareSurfaceView.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs index fcfa1a6ffc..3bafc4328c 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using Android.Content; using Android.Graphics; using Android.Runtime; @@ -64,12 +65,18 @@ namespace Avalonia.Android private void CacheSurfaceProperties(ISurfaceHolder holder) { - ReleaseNativeWindowHandle(); var surface = holder?.Surface; + var newHandle = IntPtr.Zero; if (surface?.Handle is { } handle) - _nativeWindowHandle = AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, handle); - else - _nativeWindowHandle = IntPtr.Zero; + { + newHandle = AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, handle); + } + + if (Interlocked.Exchange(ref _nativeWindowHandle, newHandle) is var oldHandle + && oldHandle != IntPtr.Zero) + { + AndroidFramebuffer.ANativeWindow_release(oldHandle); + } var frame = holder?.SurfaceFrame; _size = frame != null ? new PixelSize(frame.Width(), frame.Height()) : new PixelSize(1, 1); @@ -78,10 +85,10 @@ namespace Avalonia.Android private void ReleaseNativeWindowHandle() { - if (_nativeWindowHandle != IntPtr.Zero) + if (Interlocked.Exchange(ref _nativeWindowHandle, IntPtr.Zero) is var oldHandle + && oldHandle != IntPtr.Zero) { - AndroidFramebuffer.ANativeWindow_release(_nativeWindowHandle); - _nativeWindowHandle = IntPtr.Zero; + AndroidFramebuffer.ANativeWindow_release(oldHandle); } } }