From f8dd4248ca23070b510dde9a488c88185a394d91 Mon Sep 17 00:00:00 2001 From: Victor Chelaru Date: Mon, 20 Jul 2026 12:26:44 -0600 Subject: [PATCH] Fix off-thread accessibility hit-test crash on macOS (#21779) * Fix off-thread accessibility hit-test crash on macOS GetAutomationPeer() returns null when called off the UI thread, but -[AvnWindow automationPeer] called SetNode on it without checking, which segfaults. Guard against the null peer so it returns nil instead. Co-Authored-By: Claude Opus 4.8 (1M context) * Removed comment --------- Co-authored-by: Claude Opus 4.8 (1M context) --- native/Avalonia.Native/src/OSX/AvnWindow.mm | 12 ++++++++---- native/Avalonia.Native/src/OSX/WindowProtocol.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnWindow.mm b/native/Avalonia.Native/src/OSX/AvnWindow.mm index b2f20d556b..de0c796d4a 100644 --- a/native/Avalonia.Native/src/OSX/AvnWindow.mm +++ b/native/Avalonia.Native/src/OSX/AvnWindow.mm @@ -628,14 +628,18 @@ return GetNSStringAndRelease(automationPeer->GetAutomationId()); } -- (IAvnAutomationPeer* _Nonnull) automationPeer +- (IAvnAutomationPeer* _Nullable) automationPeer { auto parent = _parent.tryGet(); if (parent && _automationPeer == nullptr) { - _automationPeer = parent->BaseEvents->GetAutomationPeer(); - _automationNode = new AvnAutomationNode(self); - _automationPeer->SetNode(_automationNode); + auto peer = parent->BaseEvents->GetAutomationPeer(); + if (peer != nullptr) + { + _automationPeer = peer; + _automationNode = new AvnAutomationNode(self); + _automationPeer->SetNode(_automationNode); + } } return _automationPeer; diff --git a/native/Avalonia.Native/src/OSX/WindowProtocol.h b/native/Avalonia.Native/src/OSX/WindowProtocol.h index 5d1df951a6..0e1091b86c 100644 --- a/native/Avalonia.Native/src/OSX/WindowProtocol.h +++ b/native/Avalonia.Native/src/OSX/WindowProtocol.h @@ -17,7 +17,7 @@ struct IAvnAutomationPeer; -(void) showAppMenuOnly; -(void) showWindowMenuWithAppMenu; -(void) applyMenu:(AvnMenu* _Nullable)menu; --(IAvnAutomationPeer* _Nonnull) automationPeer; +-(IAvnAutomationPeer* _Nullable) automationPeer; -(double) getExtendedTitleBarHeight; -(void) setIsExtended:(bool)value;