Crash (null deref) in FTaskBase::TryRetractAndExecute from FSceneExtensionsUpdaters::End() during async FRDGBuilder deletion — macOS / Metal, UE 5.8.3

Summary

A background task worker crashes with EXC_BAD_ACCESS / KERN_INVALID_ADDRESS at 0xf8 while it deletes an FRDGBuilder asynchronously. The builder’s allocator destroys an FSceneExtensionsUpdaters object. Its End() waits on the updater tasks through UE::Tasks::Wait, and the wait tries to run one of those tasks inline (TryRetractAndExecute). The fault happens 0x34 bytes into TryRetractAndExecute: it reads a field at offset 0xf8 of a null task. That suggests one of the updater task handles was null or had already been released when End() ran.

Frequency

44 crash events from 9 users between 2026-08-21 and 2026-09-28, grouped by our crash reporter as a single issue with the same 0xf8 fault.
Seen only on macOS. We have no matching crashes from our Windows D3D12 builds, which ran 5.8.2.

Project context

The project registers two custom scene extensions. Neither implements CreateUpdater, so none of the tasks being waited on come from project code.
No project code appears on the crashing thread.

What Type of Bug are you experiencing?

AI

Steps to Reproduce

Not yet reproduced locally. It happens during normal gameplay in a packaged Shipping build on Apple Silicon. We can provide more events or test a candidate fix.

Expected Result

No crash

Observed Result

Crash

Affects Versions

5.8

Platform(s)

Mac

For crash reports, include your callstack

FTaskBase::TryRetractAndExecute(UE::FTimeout, unsigned int) +0x34 ← faulting instruction
FTaskBase::TryRetractAndExecute(UE::FTimeout, unsigned int)
FTaskBase::TryRetractAndExecute(UE::FTimeout, unsigned int)
FTaskBase::WaitImpl(UE::FTimeout)
UE::Tasks::Wait<TStaticArray<FTaskHandle, 5>>(const TStaticArray<FTaskHandle, 5>&, FTimespan)
FSceneExtensionsUpdaters::End()
FSceneExtensionsUpdaters::~FSceneExtensionsUpdaters()
FRDGAllocator::TObject::~TObject()
FRDGAllocator::~FRDGAllocator()
TFunction_OwnedObjectFRDGBuilder::~FRDGBuilder()::$_0::~TFunction_OwnedObject()
TFunction_OwnedObjectFRDGBuilder::~FRDGBuilder()::$_0::Destroy()
TExecutableTaskBaseFRDGBuilder::FAsyncDeleter::~FAsyncDeleter()::$_0::ExecuteTask()
FTaskBase::TryExecuteTask()
LowLevelTasks::FTask::ExecuteTask()
LowLevelTasks::FScheduler::TryExecuteTaskFrom<…>()
LowLevelTasks::FScheduler::WorkerLoop(…)
LowLevelTasks::FScheduler::WorkerMain(…)
FThreadImpl::Run()
FRunnableThreadPThread::Run()
FRunnableThreadPThread::_ThreadProc(void*)
_pthread_start