diff --git a/ui/base/clipboard/clipboard_format_type_win.cc b/ui/base/clipboard/clipboard_format_type_win.cc --- a/ui/base/clipboard/clipboard_format_type_win.cc +++ b/ui/base/clipboard/clipboard_format_type_win.cc @@ -15,6 +15,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/synchronization/lock.h" #include "ui/base/clipboard/clipboard_constants.h" namespace ui { @@ -224,6 +225,17 @@ const ClipboardFormatType& ClipboardFormatType::FileDescriptorType() { return *format; } +namespace { +// FileContentTypeMap() is touched from base::ThreadPool workers +// (ExtractVirtualFiles in clipboard_util_win.cc) and from the UI thread +// (HasVirtualFilenames / SetFileContents). std::map mutation is not +// thread-safe; guard it. +base::Lock& FileContentTypeMapLock() { + static base::NoDestructor lock; + return *lock; +} +} // namespace + // static std::map& ClipboardFormatType::FileContentTypeMap() { static base::NoDestructor> @@ -234,6 +246,7 @@ std::map& ClipboardFormatType::FileContentTypeMap() { // static const ClipboardFormatType& ClipboardFormatType::FileContentAtIndexType( LONG index) { + base::AutoLock auto_lock(FileContentTypeMapLock()); auto& index_to_type_map = FileContentTypeMap(); auto insert_or_assign_result = index_to_type_map.insert(