--- a/storage/browser/file_system/sandbox_file_system_backend_delegate.h 2026-06-06 00:24:32.918499945 +0000 +++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.h 2026-06-06 00:24:55.138051980 +0000 @@ -20,6 +20,7 @@ #include "base/files/file_path.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" +#include "base/synchronization/lock.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "storage/browser/file_system/file_system_backend.h" @@ -289,6 +290,10 @@ std::set> sticky_dirty_origins_; + // Guards the observer maps below; AddFile*Observer() may be invoked on the + // UI thread (FileSystemAccessBucketPathWatcher::Initialize) while + // CreateFileSystemOperationContext() reads them on the IO thread. + mutable base::Lock observers_lock_; std::map update_observers_; std::map change_observers_; std::map access_observers_; --- a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc 2026-06-06 00:24:32.920043380 +0000 +++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc 2026-06-06 00:25:26.814029120 +0000 @@ -274,15 +274,17 @@ return nullptr; } - const UpdateObserverList* update_observers = GetUpdateObservers(url.type()); - const ChangeObserverList* change_observers = GetChangeObservers(url.type()); - DCHECK(update_observers); - auto operation_context = std::make_unique(context); - operation_context->set_update_observers(*update_observers); - operation_context->set_change_observers( - change_observers ? *change_observers : ChangeObserverList()); + { + base::AutoLock locked(observers_lock_); + const UpdateObserverList* update_observers = GetUpdateObservers(url.type()); + const ChangeObserverList* change_observers = GetChangeObservers(url.type()); + DCHECK(update_observers); + operation_context->set_update_observers(*update_observers); + operation_context->set_change_observers( + change_observers ? *change_observers : ChangeObserverList()); + } return operation_context; } @@ -430,6 +432,7 @@ #if DCHECK_IS_ON() DCHECK(!is_filesystem_opened_ || io_thread_checker_.CalledOnValidThread()); #endif + base::AutoLock locked(observers_lock_); update_observers_[type] = update_observers_[type].AddObserver(std::move(observer), task_runner); } @@ -441,6 +444,7 @@ #if DCHECK_IS_ON() DCHECK(!is_filesystem_opened_ || io_thread_checker_.CalledOnValidThread()); #endif + base::AutoLock locked(observers_lock_); change_observers_[type] = change_observers_[type].AddObserver(std::move(observer), task_runner); } @@ -452,6 +456,7 @@ #if DCHECK_IS_ON() DCHECK(!is_filesystem_opened_ || io_thread_checker_.CalledOnValidThread()); #endif + base::AutoLock locked(observers_lock_); access_observers_[type] = access_observers_[type].AddObserver(std::move(observer), task_runner); }