CVE-2025-11205
Overview
Background
- WebGPU compatibility mode
- A restricted Dawn device mode (
device->IsCompatibilityMode()) for older graphics APIs, which also limits the number of texture+sampler combinations per shader stage (min(maxSampledTexturesPerShaderStage, maxSamplersPerShaderStage)). - `EntryPointMetadata::bindings`
- Dawn’s per-entry-point reflection data, indexed by
BindGroupIndexand holding a map fromBindingNumberto binding info for each bind group. - Delayed validation in reflection
- When reflecting a shader with Tint, Dawn records some limit violations, such as a
@groupindex exceedingmaxBindGroups, throughDelayedInvalidIfand reports them later, so reflection keeps running on data that has already broken limits. - `BindingSlot`
- Dawn’s
(group, binding)pair; this patch gives it==,!=and<operators so it can be stored in astd::set.
Root Cause Analysis
The commit subject places the overflow in ReflectEntryPointUsingTint. In compatibility mode, that function counted texture+sampler combinations near its end by indexing metadata->bindings[BindGroupIndex(pair.texture_binding_point.group)] for every texture/sampler pair. The group index comes straight from the shader’s @group(N) attribute. Because the “exceeds maxBindGroups” violation is only recorded as a delayed error, reflection reached this code with arbitrary group indices, such as @group(2345) in the regression test, and indexed past the bounded per-group bindings storage. The old code then dereferenced it->second without checking it != bindingGroupInfoMap.end(), which compounded the out-of-bounds access.
The fix deletes the computation and the numTextureSamplerCombinations metadata field from reflection. It moves the count into a new ComputeNumTextureSamplerCombinations() that ValidateProgrammableStage() calls at pipeline creation, and adds the missing it != end() check. The regression test expects pipeline creation to fail with “exceeds maxBindGroups”, which suggests the delayed group-limit error is raised before the new computation indexes bindings (inferred; the earlier part of ValidateProgrammableStage is not in the diff). The ShaderModule.h hunk is cut off after the removed field, so the addition of samplerAndNonSamplerTexturePairs and nonSamplerBindingPoint to EntryPointMetadata, which the new function relies on, is not shown.
@group index as an array index after the out-of-range group had been noted only as a deferred error, without bounds-checking the index or checking the map lookup. The fix moves the computation to pipeline validation, after limit errors are reported, and guards the map lookup.Attack Path
- Get a compatibility-mode device
The attacker needs a Dawn device for which
IsCompatibilityMode()is true, because the removed code ran only underdeviceInfo.isCompatibilityMode. - Submit WGSL with huge group indices
A shader declares textures at
@groupvalues far beyondmaxBindGroups(the test uses 2345 and 6789) and uses them with a sampler, for example viatextureSample. - Reflection continues past the limit error
ReflectEntryPointUsingTintrecords the group-limit violation as a delayed error but goes on to the texture+sampler counting loop. - Out-of-bounds index in the GPU process
metadata->bindings[BindGroupIndex(group)]reads past the per-group storage, and the resulting map’sfind()and the uncheckedit->secondoperate on out-of-bounds heap memory (the advisory classifies this as a heap buffer overflow).
Impact Assessment
Changed Functions
| Function | Change | Notes |
|---|---|---|
DAWN_SERIALIZABLEsrc/dawn/native/BindingInfo.h |
modified | |
ifsrc/dawn/native/BindingInfo.h |
modified | |
forsrc/dawn/native/Pipeline.cpp |
modified | |
ifsrc/dawn/native/Pipeline.cpp |
modified | |
ifsrc/dawn/native/ShaderModule.cpp |
modified | |
forsrc/dawn/native/ShaderModule.cpp |
modified |
Files Changed
src/dawn/native/BindingInfo.hsrc/dawn/native/Pipeline.cppsrc/dawn/native/ShaderModule.cppsrc/dawn/native/ShaderModule.h
Audit Directions
- Work done after a deferred errorIn
ReflectEntryPointUsingTintand similar reflection code, look for any code that runs after aDelayedInvalidIfand still uses the offending value (a group index, a binding number, an array size) as an index. - Unchecked `find()` resultsGrep Dawn native for
->secondorit->afterfind()on per-group binding maps where the code does not compare againstend(). - Shader-controlled indices into fixed-size per-group arraysAudit uses of
BindGroupIndex(...)built from TintBindingPoint.groupvalues, inbindings, layouts and per-stage counts, to confirm each is checked againstkMaxBindGroupsbefore indexing.
Patch
From 471c3d7e4b83b98ec8c0d8e2d4b566c3b7f5e43c Mon Sep 17 00:00:00 2001
From: Gregg Tavares <gman@chromium.org>
Date: Wed, 03 Sep 2025 18:52:22 -0700
Subject: [PATCH] Fix Heap-overflow in dawn ReflectEntryPointUsingTint
Note: The operators needed to be added so BindingSlot
can be used in std::set. The needed to be constexpr
so that the static_assert that converting a tint
nonSamplerBindingPoint turns into a dawn nonSamplerBindingPoint.
The clang-format off is needed because clang-format fails
on the code in BindingPoint.h
Change-Id: I1bdc075323a14bda264655e475fe6fdc074ced8a
Bug: 442444724
Fixes: 442444724
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/260455
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Gregg Tavares <gman@chromium.org>
Auto-Submit: Gregg Tavares <gman@chromium.org>
---
diff --git a/src/dawn/native/BindingInfo.h b/src/dawn/native/BindingInfo.h
index 8692406..4b51171 100644
--- a/src/dawn/native/BindingInfo.h
+++ b/src/dawn/native/BindingInfo.h
@@ -163,7 +163,27 @@
#define BINDING_SLOT_MEMBER(X) \
X(BindGroupIndex, group) \
X(BindingNumber, binding)
-DAWN_SERIALIZABLE(struct, BindingSlot, BINDING_SLOT_MEMBER){};
+// clang-format off
+DAWN_SERIALIZABLE(struct, BindingSlot, BINDING_SLOT_MEMBER){
+ constexpr bool operator==(const BindingSlot& rhs) const {
+ return group == rhs.group && binding == rhs.binding;
+ }
+
+ constexpr bool operator!=(const BindingSlot& rhs) const {
+ return !(*this == rhs);
+ }
+
+ constexpr bool operator<(const BindingSlot& rhs) const {
+ if (group < rhs.group) {
+ return true;
+ }
+ if (group > rhs.group) {
+ return false;
+ }
+ return binding < rhs.binding;
+ }
+};
+// clang-format on
#undef BINDING_SLOT_MEMBER
struct PerStageBindingCounts {
diff --git a/src/dawn/native/Pipeline.cpp b/src/dawn/native/Pipeline.cpp
index 2e67435..909eb09 100644
--- a/src/dawn/native/Pipeline.cpp
+++ b/src/dawn/native/Pipeline.cpp
@@ -28,6 +28,7 @@
#include "dawn/native/Pipeline.h"
#include <algorithm>
+#include <set>
#include <utility>
#include "absl/container/flat_hash_set.h"
@@ -43,6 +44,48 @@
#include "src/utils/numeric.h"
namespace dawn::native {
+
+namespace {
+
+// Number of texture+sampler combinations, computed as 1 for every texture+sampler
+// combination + 1 for every texture used without a sampler that wasn't previously counted.
+// Note: this is only used in compatibility mode.
+uint32_t ComputeNumTextureSamplerCombinations(const dawn::native::EntryPointMetadata& metadata) {
+ // separate sampled from non-sampled and put sampled in set
+ std::set<BindingSlot> sampledTextures;
+ std::set<BindingSlot> sampledExternalTextures;
+ std::vector<BindingSlot> nonSampled;
+ uint32_t numSamplerTexturePairs = 0;
+ uint32_t numSamplerExternalTexturePairs = 0;
+
+ for (const auto& pair : metadata.samplerAndNonSamplerTexturePairs) {
+ const auto& bindingGroupInfoMap = metadata.bindings[BindGroupIndex(pair.texture.group)];
+ const auto it = bindingGroupInfoMap.find(BindingNumber(pair.texture.binding));
+ auto isExternalTexture =
+ it != bindingGroupInfoMap.end() &&
+ std::holds_alternative<ExternalTextureBindingInfo>(it->second.bindingInfo);
+ if (isExternalTexture) {
+ ++numSamplerExternalTexturePairs;
+ sampledExternalTextures.insert(pair.texture);
+ } else if (pair.sampler == EntryPointMetadata::nonSamplerBindingPoint) {
+ nonSampled.push_back(pair.texture);
+ } else {
+ ++numSamplerTexturePairs;
+ sampledTextures.insert(pair.texture);
+ }
+ }
+
+ // count the number of non-sampled that are not referenced by sampled pairs.
+ auto numNonSampled = std::count_if(nonSampled.begin(), nonSampled.end(),
+ [&](const BindingSlot& nonSampledBindingPoint) {
+ return !sampledTextures.contains(nonSampledBindingPoint);
+ });
+ return numSamplerTexturePairs + numNonSampled + numSamplerExternalTexturePairs * 3 +
+ sampledExternalTextures.size();
+}
+
+} // namespace
+
ResultOrError<ShaderModuleEntryPoint> ValidateProgrammableStage(DeviceBase* device,
const ShaderModuleBase* module,
StringView entryPointName,
@@ -103,11 +146,12 @@
const CombinedLimits& limits = device->GetLimits();
uint32_t maxCombos =
std::min(limits.v1.maxSampledTexturesPerShaderStage, limits.v1.maxSamplersPerShaderStage);
+ uint32_t numTextureSamplerCombinations = ComputeNumTextureSamplerCombinations(metadata);
DAWN_INVALID_IF(
- device->IsCompatibilityMode() && metadata.numTextureSamplerCombinations > maxCombos,
+ device->IsCompatibilityMode() && numTextureSamplerCombinations > maxCombos,
"Entry-point uses %u texture+sampler combinations which is more than the maximum of %u "
"combinations in compatibility mode",
- metadata.numTextureSamplerCombinations, maxCombos);
+ numTextureSamplerCombinations, maxCombos);
// Validate if overridable constants exist in shader module
// pipelineBase is not yet constructed at this moment so iterate constants from descriptor
diff --git a/src/dawn/native/ShaderModule.cpp b/src/dawn/native/ShaderModule.cpp
index b5e8a92..67cc22b 100644
--- a/src/dawn/native/ShaderModule.cpp
+++ b/src/dawn/native/ShaderModule.cpp
@@ -29,7 +29,6 @@
#include <algorithm>
#include <limits>
-#include <set>
#include <sstream>
#include <utility>
@@ -1324,44 +1323,6 @@
metadata->usesSubgroupMatrix = entryPoint.uses_subgroup_matrix;
- // Compute the texture+sampler combination count.
- if (deviceInfo.isCompatibilityMode) {
- // separate sampled from non-sampled and put sampled in set
- std::set<tint::BindingPoint> sampledTextures;
- std::set<tint::BindingPoint> sampledExternalTextures;
- std::vector<tint::BindingPoint> nonSampled;
- uint32_t numSamplerTexturePairs = 0;
- uint32_t numSamplerExternalTexturePairs = 0;
-
- for (const auto& pair : samplerAndNonSamplerTextureUses) {
- const auto& bindingGroupInfoMap =
- metadata->bindings[BindGroupIndex(pair.texture_binding_point.group)];
- const auto it =
- bindingGroupInfoMap.find(BindingNumber(pair.texture_binding_point.binding));
- auto isExternalTexture =
- std::holds_alternative<ExternalTextureBindingInfo>(it->second.bindingInfo);
- if (isExternalTexture) {
- ++numSamplerExternalTexturePairs;
- sampledExternalTextures.insert(pair.texture_binding_point);
- } else if (pair.sampler_binding_point == tintNonSamplerBindingPoint) {
- nonSampled.push_back(pair.texture_binding_point);
- } else {
- ++numSamplerTexturePairs;
- sampledTextures.insert(pair.texture_binding_point);
- }
- }
-
- // count the number of non-sampled that are not referenced by sampled pairs.
- auto numNonSampled =
- std::count_if(nonSampled.begin(), nonSampled.end(),
- [&](const tint::BindingPoint& nonSampledBindingPoint) {
- return !sampledTextures.contains(nonSampledBindingPoint);
- });
- metadata->numTextureSamplerCombinations = numSamplerTexturePairs + numNonSampled +
- numSamplerExternalTexturePairs * 3 +
- sampledExternalTextures.size();
- }
-
#undef DelayedInvalidIf
return std::move(metadata);
}
diff --git a/src/dawn/native/ShaderModule.h b/src/dawn/native/ShaderModule.h
index a70f61a..0ec26d6 100644
--- a/src/dawn/native/ShaderModule.h
+++ b/src/dawn/native/ShaderModule.h
@@ -329,11 +329,7 @@
X(bool, usesDepthTextureWithNonComparisonSampler) \
X(bool, usesSubgroupMatrix) \
/* Immediate Data block byte size */ \
- X(uint32_t, immediateDataRangeByteSize) \
- /* Number of texture+sampler combinations, computed as 1 for every texture+sampler */ \
- /* combination + 1 for every texture used without a sampler that wasn't previously counted.*/ \
- /* Note: this is only set in compatibility mode. */ \
- X(uint32_t, numTextureSamplerCombinations)
Regression Test / PoC
diff --git a/src/dawn/tests/unittests/validation/CompatValidationTests.cpp b/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
index c163322..e3cf581 100644
--- a/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
@@ -256,6 +256,45 @@
}
}
+// Test that large group ids don't crash
+TEST_F(CompatValidationTest, LargeGroupIds) {
+ wgpu::ShaderModule module = utils::CreateShaderModule(device, R"(
+@group(0) @binding(0) var smp: sampler;
+@group(2345) @binding(0) var tex1: texture_2d<f32>;
+@group(6789) @binding(0) var tex2: texture_2d<f32>;
+
+@vertex fn vs() -> @builtin(position) vec4f {
+ let c = textureLoad(tex1, vec2u(0), 0) + textureLoad(tex2, vec2u(0), 0);
+ return c;
+}
+
+@fragment fn fs() -> @location(0) vec4f {
+ let c = textureSample(tex1, smp, vec2f(0)) + textureSample(tex2, smp, vec2f(0));
+ return c;
+}
+
+@compute @workgroup_size(1) fn main() {
+ let c = textureSampleLevel(tex1, smp, vec2f(0), 0) + textureSampleLevel(tex2, smp, vec2f(0), 0);
+})");
+
+ {
+ wgpu::ComputePipelineDescriptor pDesc;
+ pDesc.compute.module = module;
+ ASSERT_DEVICE_ERROR(device.CreateComputePipeline(&pDesc),
+ testing::HasSubstr("exceeds maxBindGroups"));
+ }
+ {
+ utils::ComboRenderPipelineDescriptor pDesc;
+ pDesc.vertex.module = module;
+ pDesc.cFragment.module = module;
+ pDesc.cFragment.targetCount = 1;
+ pDesc.cTargets[0].format = wgpu::TextureFormat::RGBA8Unorm;
+
+ ASSERT_DEVICE_ERROR(device.CreateRenderPipeline(&pDesc),
+ testing::HasSubstr("exceeds maxBindGroups"));
+ }
+}
+
TEST_F(CompatValidationTest, CanNotCreatePipelineWithDepthTextureUsedWithNonComparisonSampler) {
wgpu::ShaderModule module = utils::CreateShaderModule(device, R"(
@group(1) @binding(0) var s: sampler;
Original Bug Report
Heap-buffer-overflow/wild-read in dawn::native::`anonymous namespace'::ReflectEntryPointUsingTint
Tested on: Chromium: 141.0.7379.0 (Developer Build) (64-bit) OS: Windows 11 Version 24H2 (Build 26100.4946)
GPU-info: Integrated AMD Radeon Graphics of AMD Ryzen 5 5625U
To reproduce run attached .html with ‘–enable-experimental-web-platform-features’ flag.
chromium-141.0.7379.0-win64-asan\chrome.exe –enable-experimental-web-platform-features heap-buffer-overflow-dawnnativeReflectEntryPointUsingTint.html
Reproduces also on Ubuntu 22.04 with ‘–enable-unsafe-webgpu’, but doesn’t require ‘–enable-experimental-web-platform-features’.
ASAN-trace:
==18232==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x1207e5f47bc0 at pc 0x7ffd880d6c79 bp
0x000893ffd030 sp 0x000893ffd078
READ of size 8 at 0x1207e5f47bc0 thread T0
SCARINESS: 33 (8-byte-read-heap-buffer-overflow-far-from-bounds)
#0 0x7ffd880d6c78 in absl::container_internal::raw_hash_set<absl::container_internal::FlatHashMapPolicy<unsigned int,dawn::native::ShaderBindingInfo>,absl::hash_internal::Hash<unsigned int>,std::__Cr::equal_to<unsigned int>,std::__Cr::allocator<std::_Cr::pair<const unsigned int,dawn::native::ShaderBindingInfo> > >::find<unsigned int> C:\b\s\w\ir\cache\builder\src\third
party\abseil-cpp\absl\container\internal\raw_hash_set.h:2815
#1 0x7ffd880ce340 in dawn::native::anonymous namespace'::ReflectEntryPointUsingTint C:\b\s\w\ir\cache\builder\src\third_party\dawn\src\dawn\native\ShaderModule.cpp:1316 #2 0x7ffd880bbe2c in dawn::native::ParseShaderModule C:\b\s\w\ir\cache\builder\src\third_party\dawn\src\dawn\native\ShaderModule.cpp:1571 #3 0x7ffd87f69109 in dawn::native::LoadOrRun<dawn::Result<dawn::native::ShaderModuleParseResult,dawn::native::ErrorData> (*)(dawn::native::Blob),dawn::Result<dawn::native::ShaderModuleParseResult,dawn::native::ErrorData> (*)(dawn::native::ShaderModuleParseRequest)> C:\b\s\w\ir\cache\builder\src\third_party\dawn\src\dawn\native\CacheRequest.h:165 #4 0x7ffd87f33d7b in dawn::native::DeviceBase::CreateShaderModule C:\b\s\w\ir\cache\builder\src\third_party\dawn\src\dawn\native\Device.cpp:2231 #5 0x7ffd87f49789 in dawn::native::DeviceBase::APICreateShaderModule C:\b\s\w\ir\cache\builder\src\third_party\dawn\src\dawn\native\Device.cpp:1448 #6 0x7ffd9dc610bd in dawn::wire::server::Server::DoDeviceCreateShaderModule C:\b\s\w\ir\cache\builder\src\out\069a-Win_ASan_Releas\gen\third_party\dawn\src\dawn\wire\server\ServerDoers_autogen.cpp:328 #7 0x7ffd9dc73e24 in dawn::wire::server::Server::HandleDeviceCreateShaderModule C:\b\s\w\ir\cache\builder\src\out\069a-Win_ASan_Releas\gen\third_party\dawn\src\dawn\wire\server\ServerHandlers_autogen.cpp:643 #8 0x7ffd9dc78acb in dawn::wire::server::Server::HandleCommandsImpl C:\b\s\w\ir\cache\builder\src\out\069a-Win_ASan_Releas\gen\third_party\dawn\src\dawn\wire\server\ServerHandlers_autogen.cpp:1706 #9 0x7ffd9dc97412 in gpu::webgpu::anonymous namespace’::DawnWireServer::HandleCommands C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\webgpu_decoder_impl.cc:156
#10 0x7ffd9dc97865 in gpu::webgpu::anonymous namespace'::WebGPUDecoderImpl::HandleDawnCommands C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\webgpu_decoder_impl.cc:1963 #11 0x7ffd9dc8d201 in gpu::webgpu::anonymous namespace’::WebGPUDecoderImpl::DoCommands C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\webgpu_decoder_impl.cc:1908
#12 0x7ffd88c18213 in gpu::CommandBufferService::Flush C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\command_buffer_service.cc:266
#13 0x7ffd9dd269de in gpu::CommandBufferStub::OnAsyncFlush C:\b\s\w\ir\cache\builder\src\gpu\ipc\service\command_buffer_stub.cc:495
#14 0x7ffd9dd258e5 in gpu::CommandBufferStub::ExecuteDeferredRequest C:\b\s\w\ir\cache\builder\src\gpu\ipc\service\command_buffer_stub.cc:162
#15 0x7ffd9dcf0beb in gpu::GpuChannel::ExecuteDeferredRequest C:\b\s\w\ir\cache\builder\src\gpu\ipc\service\gpu_channel.cc:848
#16 0x7ffd9dd00b83 in base::internal::Invoker<base::internal::FunctorTraits<void (GpuChannel::*&&)(mojo::StructPtrgpu::mojom::DeferredRequestParams, gpu::FenceSyncReleaseDelegate ),base::WeakPtrgpu::GpuChannel &&,mojo::StructPtrgpu::mojom::DeferredRequestParams &&>,base::internal::BindState<1,1,0,void (GpuChannel::)(mojo::StructPtr<gpu::mojom::DeferredRequestPara
ms>, gpu::FenceSyncReleaseDelegate *),base::WeakPtrgpu::GpuChannel,mojo::StructPtrgpu::mojom::DeferredRequestParams >,void (gpu::FenceSyncReleaseDelegate *)>::RunOnce C:\b\s\w\ir\cache\builder\src\base\functional\bind_internal.h:973
#17 0x7ffd88c5839d in base::internal::Invoker<base::internal::FunctorTraits<base::OnceCallback<void (gpu::FenceSyncReleaseDelegate *)> &&,gpu::FenceSyncReleaseDelegate *>,base::internal::BindState<0,1,1,base::OnceCallback<void (gpu::FenceSyncReleaseDelegate *)>,base::internal::UnretainedWrappergpu::FenceSyncReleaseDelegate,base::unretained_traits::MayNotDangle,0 >,void
()>::RunImpl<base::OnceCallback<void (gpu::FenceSyncReleaseDelegate )>,std::__Cr::tuple<base::internal::UnretainedWrappergpu::FenceSyncReleaseDelegate,base::unretained_traits::MayNotDangle,0 >,0> C:\b\s\w\ir\cache\builder\src\base\functional\bind_internal.h:1060
#18 0x7ffd88c2bfd0 in gpu::Scheduler::ExecuteSequence C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\scheduler.cc:672
#19 0x7ffd88c29c6d in gpu::Scheduler::RunNextTask C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\scheduler.cc:594
#20 0x7ffd88c2f468 in base::internal::Invoker<base::internal::FunctorTraits<void (Scheduler::&&)(),gpu::Scheduler >,base::internal::BindState<1,1,0,void (Scheduler::)(),base::internal::UnretainedWrappergpu::Scheduler,base::unretained_traits::MayNotDangle,0 >,void ()>::RunOnce C:\b\s\w\ir\cache\builder\src\base\functional\bind_internal.h:973
#21 0x7ffd98e138c3 in base::TaskAnnotator::RunTaskImpl C:\b\s\w\ir\cache\builder\src\base\task\common\task_annotator.cc:207
#22 0x7ffd98de6a19 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl C:\b\s\w\ir\cache\builder\src\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc:472
#23 0x7ffd98de58bf in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork C:\b\s\w\ir\cache\builder\src\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc:346
#24 0x7ffd98f48b32 in base::MessagePumpDefault::Run C:\b\s\w\ir\cache\builder\src\base\message_loop\message_pump_default.cc:42
#25 0x7ffd98de8761 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run C:\b\s\w\ir\cache\builder\src\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc:647
#26 0x7ffd98e8638e in base::RunLoop::Run C:\b\s\w\ir\cache\builder\src\base\run_loop.cc:134
#27 0x7ffda2326ab5 in content::GpuMain C:\b\s\w\ir\cache\builder\src\content\gpu\gpu_main.cc:474
#28 0x7ffd94f18a40 in content::RunOtherNamedProcessTypeMain C:\b\s\w\ir\cache\builder\src\content\app\content_main_runner_impl.cc:763
#29 0x7ffd94f1ae73 in content::ContentMainRunnerImpl::Run C:\b\s\w\ir\cache\builder\src\content\app\content_main_runner_impl.cc:1129
#30 0x7ffd94f0f3cf in content::RunContentProcess C:\b\s\w\ir\cache\builder\src\content\app\content_main.cc:346
#31 0x7ffd94f0f95d in content::ContentMain C:\b\s\w\ir\cache\builder\src\content\app\content_main.cc:359
#32 0x7ffd85cd301f in ChromeMain C:\b\s\w\ir\cache\builder\src\chrome\app\chrome_main.cc:228
#33 0x7ff76a84479b in MainDllLoader::Launch C:\b\s\w\ir\cache\builder\src\chrome\app\main_dll_loader_win.cc:201
#34 0x7ff76a84200c in main C:\b\s\w\ir\cache\builder\src\chrome\app\chrome_exe_main_win.cc:352
#35 0x7ff76acffa2f in __scrt_common_main_seh D:\a_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
#36 0x7ffeb034e8d6 in BaseThreadInitThunk+0x16 (C:\WINDOWS\System32\KERNEL32.DLL+0x18002e8d6)
#37 0x7ffeb1d5c34b in RtlUserThreadStart+0x2b (C:\WINDOWS\SYSTEM32\ntdll.dll+0x18003c34b)
Address 0x1207e5f47bc0 is a wild pointer inside of access range of size 0x000000000008.
SUMMARY: AddressSanitizer: heap-buffer-overflow C:\b\s\w\ir\cache\builder\src\third_party\abseil-cpp\absl\container\internal\raw_hash_set.h:2815 in absl::container_internal::raw_hash_set<absl::container_internal::FlatHashMapPolicy<unsigned int,dawn::native::ShaderBindingInfo>,absl::hash_internal::Hash<unsigned int>,std::__Cr::equal_to<unsigned int>,std::__Cr::allocator<std::
__Cr::pair<const unsigned int,dawn::native::ShaderBindingInfo> > >::find<unsigned int>
Shadow bytes around the buggy address:
0x1207e5f47900: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47980: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47a00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47a80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47b00: fd fd fd fd fd fd fd fd fd fd fd fd fd fa fa fa
=>0x1207e5f47b80: fa fa fa fa fa fa fa fa[fa]fa fa fa fa fa fa fa
0x1207e5f47c00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa f7 fa
0x1207e5f47c80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47d00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47d80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
0x1207e5f47e00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==18232==ADDITIONAL INFO
==18232==Note: Please include this section with the ASan report.
Task trace:
#0 0x7ffd88c2a1fc in gpu::Scheduler::RunNextTask C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\scheduler.cc:610
#1 0x7ffd88c2a1fc in gpu::Scheduler::RunNextTask C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\scheduler.cc:610
#2 0x7ffd88c2a1fc in gpu::Scheduler::RunNextTask C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\scheduler.cc:610
#3 0x7ffd88c2a1fc in gpu::Scheduler::RunNextTask C:\b\s\w\ir\cache\builder\src\gpu\command_buffer\service\scheduler.cc:610
Command line: "chromium-141.0.7379.0-win64-asan\chrome.exe" --type=gpu-process --no-pre-read-main-dll --start-stack-profiler --gpu-preferences=SAAAAAAAAADgAQAEAAAAAAAAAAAAAMAAAwAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAA== --metrics-shmem-handle=1856,i,16049326817075466414,7205898037398527891,262144 - -field-trial-handle=1960,i,2671077517126853030,12550265571060057205,262144 --enable-features=BlockInsecurePrivateNetworkRequests,BlockInsecurePrivateNetworkRequestsFromPrivate,BlockInsecurePrivateNetworkRequestsFromUnknown,CookieIndicesHeader,CookieSameSiteConsidersRedirectChain,CreateImageBitmapOrientationNone,CriticalClientHint,DocumentPolicyNegotiation,EnableCanvas2DLayer s,ExperimentalContentSecurityPolicyFeatures,OriginIsolationHeader,PartitionedPopins,PrefetchCookieIndices,PrivateNetworkAccessRespectPreflightResults,ThirdPartyStoragePartitioning --variations-seed-version --mojo-platform-channel-handle=1952 /prefetch:2
==18232==END OF ADDITIONAL INFO
==18232==ABORTING