CVE-2026-8525
Overview
Changed Functions
| Function | Change | Notes |
|---|---|---|
VertexAttributeShiftInstancedArrayDataWithOffsetTestsrc/tests/gl_tests/VertexAttributeTest.cpp |
modified |
Files Changed
src/libANGLE/renderer/gl/VertexArrayGL.cppsrc/libANGLE/renderer/gl/VertexArrayGL.hsrc/tests/gl_tests/VertexAttributeTest.cpp
Patch
From c0c3b52cec94593157bea7a5ecd9e1ab7b2ce802 Mon Sep 17 00:00:00 2001 From: Shrek Shao <[email protected]> Date: Thu, 02 Apr 2026 13:05:19 -0700 Subject: [PATCH] GL: Fix heap-buffer-overflow in streamAttributes When the shiftInstancedArrayDataWithOffset workaround is enabled (primarily for Intel drivers on macOS), the number of vertices to stream is increased to account for the first parameter in drawArraysInstanced. However, computeStreamingAttributeSizes was not aware of this workaround, leading to an under-allocation of the streaming buffer. Additionally, the copy loop in streamAttributes used the increased vertex count to read from the source client memory. This resulted in a heap-buffer-overflow because the source buffer might only contain enough data for the original instance count, and the destination buffer was also too small for the shifted layout. This CL: 1. Updates computeStreamingAttributeSizes to accept an applyExtraOffsetWorkaroundForInstancedAttributes flag and correctly calculate the required buffer size when the workaround is active. 2. Updates streamAttributes to only copy the original number of vertices from the source memory in both fast and slow paths. 3. Ensures the destination buffer layout still respects the increased vertex count for correct attribute spacing as required by the workaround. 4. Adds a regression test ShiftInstancedArrayDataWithOffsetSlowPath in VertexAttributeTest.cpp that triggers the workaround and the slow path copy loop. Bug: b/497928952 Change-Id: I4b59ceec7cf9fc301eacb5b22faa4a3b2c2c863d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7728161 Reviewed-by: Geoff Lang <[email protected]> Commit-Queue: Shrek Shao <[email protected]> Auto-Submit: Shrek Shao <[email protected]> --- diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp index 489cbff..f4774a5 100644 --- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp +++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp @@ -367,11 +367,13 @@ return angle::Result::Continue; } -void VertexArrayGL::computeStreamingAttributeSizes(const gl::AttributesMask &attribsToStream, - GLsizei instanceCount, - const gl::IndexRange &indexRange, - size_t *outStreamingDataSize, - size_t *outMaxAttributeDataSize) const +void VertexArrayGL::computeStreamingAttributeSizes( + const gl::AttributesMask &attribsToStream, + GLsizei instanceCount, + const gl::IndexRange &indexRange, + size_t *outStreamingDataSize, + size_t *outMaxAttributeDataSize, + bool applyExtraOffsetWorkaroundForInstancedAttributes) const { *outStreamingDataSize = 0; *outMaxAttributeDataSize = 0; @@ -391,9 +393,14 @@ // the attribute with the largest data size. size_t typeSize = ComputeVertexAttributeTypeSize(attrib); GLuint adjustedDivisor = GetAdjustedDivisor(mAppliedNumViews, binding.getDivisor()); - *outStreamingDataSize += - typeSize * ComputeVertexBindingElementCount(adjustedDivisor, indexRange.vertexCount(), - instanceCount); + size_t streamedVertexCount = ComputeVertexBindingElementCount( + adjustedDivisor, indexRange.vertexCount(), instanceCount); + if (applyExtraOffsetWorkaroundForInstancedAttributes && adjustedDivisor > 0) + { + streamedVertexCount = + (instanceCount + indexRange.start() + adjustedDivisor - 1u) / adjustedDivisor; + } + *outStreamingDataSize += typeSize * streamedVertexCount; *outMaxAttributeDataSize = std::max(*outMaxAttributeDataSize, typeSize); } } @@ -413,7 +420,8 @@ size_t maxAttributeDataSize = 0; computeStreamingAttributeSizes(attribsToStream, instanceCount, indexRange, &streamingDataSize, - &maxAttributeDataSize); + &maxAttributeDataSize, + applyExtraOffsetWorkaroundForInstancedAttributes); if (streamingDataSize == 0) { @@ -468,6 +476,7 @@ // shiftInstancedArrayDataWithOffset workaround, otherwise it's const size_t streamedVertexCount = ComputeVertexBindingElementCount( adjustedDivisor, indexRange.vertexCount(), instanceCount); + const size_t originalStreamedVertexCount = streamedVertexCount; const size_t sourceStride = ComputeVertexAttributeStride(attrib, binding); const size_t destStride = ComputeVertexAttributeTypeSize(attrib); @@ -491,7 +500,6 @@ if (applyExtraOffsetWorkaroundForInstancedAttributes && adjustedDivisor > 0) { - const size_t originalStreamedVertexCount = streamedVertexCount; streamedVertexCount = (instanceCount + indexRange.start() + adjustedDivisor - 1u) / adjustedDivisor; @@ -545,7 +553,7 @@ } else { - for (size_t vertexIdx = 0; vertexIdx < streamedVertexCount; vertexIdx++) + for (size_t vertexIdx = 0; vertexIdx < originalStreamedVertexCount; vertexIdx++) { uint8_t *out = bufferPointer + curBufferOffset + (destStride * vertexIdx); const uint8_t *in = diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.h b/src/libANGLE/renderer/gl/VertexArrayGL.h index 2b08576..b018e80 100644 --- a/src/libANGLE/renderer/gl/VertexArrayGL.h +++ b/src/libANGLE/renderer/gl/VertexArrayGL.h @@ -91,11 +91,13 @@ // Returns the amount of space needed to stream all attributes that need streaming // and the data size of the largest attribute - void computeStreamingAttributeSizes(const gl::AttributesMask &attribsToStream, - GLsizei instanceCount, - const gl::IndexRange &indexRange, - size_t *outStreamingDataSize, - size_t *outMaxAttributeDataSize) const; + void computeStreamingAttributeSizes( + const gl::AttributesMask &attribsToStream, + GLsizei instanceCount, + const gl::IndexRange &indexRange, + size_t *outStreamingDataSize, + size_t *outMaxAttributeDataSize, + bool applyExtraOffsetWorkaroundForInstancedAttributes) const; // Stream attributes that have client data angle::Result streamAttributes(const gl::Context *context, diff --git a/src/tests/gl_tests/VertexAttributeTest.cpp b/src/tests/gl_tests/VertexAttributeTest.cpp index 8d84081..1c78745 100644 --- a/src/tests/gl_tests/VertexAttributeTest.cpp +++ b/src/tests/gl_tests/VertexAttributeTest.cpp @@ -5759,6 +5759,68 @@ # define EMULATED_VAO_CONFIGS #endif +class VertexAttributeShiftInstancedArrayDataWithOffsetTest : public VertexAttributeTest +{}; + +// Regression test (crbug.com/497928952) for heap-buffer-overflow in streamAttributes() when +// shiftInstancedArrayDataWithOffset workaround is enabled. +TEST_P(VertexAttributeShiftInstancedArrayDataWithOffsetTest, + ShiftInstancedArrayDataWithOffsetSlowPath) +{ + // The workaround is specifically for Mac Intel, but we can enable it for this test. + // It is only triggered for drawArraysInstanced with first > 0. + // The slow path is triggered when sourceStride != destStride. + ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_instanced_arrays") && + getClientMajorVersion() < 3); + + constexpr char kVS[] = R"(attribute vec4 position; +attribute vec4 instance; +varying vec4 color; +void main() { + gl_Position = position + instance * 0.001; + color = vec4(1, 0, 0, 1); +})"; + constexpr char kFS[] = R"(varying lowp vec4 color; +void main() { + gl_FragColor = color; +})"; + + ANGLE_GL_PROGRAM(program, kVS, kFS); + glUseProgram(program); + GLint posLoc = glGetAttribLocation(program, "position"); + GLint instLoc = glGetAttribLocation(program, "instance"); + + auto quadVertices = GetQuadVertices(); + GLBuffer posBuf; + glBindBuffer(GL_ARRAY_BUFFER, posBuf); + glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(), + GL_STATIC_DRAW); + glEnableVertexAttribArray(posLoc); + glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + + const int instanceCount = 1024; + const int srcStride = 20; // 20 bytes stride for vec4 (16 bytes) forces slow path + std::vector<uint8_t> instData(instanceCount * srcStride, 0); + GLBuffer instBuf; + glBindBuffer(GL_ARRAY_BUFFER, instBuf); + glBufferData(GL_ARRAY_BUFFER, instData.size(), instData.data(), GL_STATIC_DRAW); + glEnableVertexAttribArray(instLoc); + glVertexAttribPointer(instLoc, 4, GL_FLOAT, GL_FALSE, srcStride, nullptr); + glVertexAttribDivisorANGLE(instLoc, 1); + + const int first = 100;
Regression Test / PoC
diff --git a/src/tests/gl_tests/VertexAttributeTest.cpp b/src/tests/gl_tests/VertexAttributeTest.cpp
index 8d84081..1c78745 100644
--- a/src/tests/gl_tests/VertexAttributeTest.cpp
+++ b/src/tests/gl_tests/VertexAttributeTest.cpp
@@ -5759,6 +5759,68 @@
# define EMULATED_VAO_CONFIGS
#endif
+class VertexAttributeShiftInstancedArrayDataWithOffsetTest : public VertexAttributeTest
+{};
+
+// Regression test (crbug.com/497928952) for heap-buffer-overflow in streamAttributes() when
+// shiftInstancedArrayDataWithOffset workaround is enabled.
+TEST_P(VertexAttributeShiftInstancedArrayDataWithOffsetTest,
+ ShiftInstancedArrayDataWithOffsetSlowPath)
+{
+ // The workaround is specifically for Mac Intel, but we can enable it for this test.
+ // It is only triggered for drawArraysInstanced with first > 0.
+ // The slow path is triggered when sourceStride != destStride.
+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_instanced_arrays") &&
+ getClientMajorVersion() < 3);
+
+ constexpr char kVS[] = R"(attribute vec4 position;
+attribute vec4 instance;
+varying vec4 color;
+void main() {
+ gl_Position = position + instance * 0.001;
+ color = vec4(1, 0, 0, 1);
+})";
+ constexpr char kFS[] = R"(varying lowp vec4 color;
+void main() {
+ gl_FragColor = color;
+})";
+
+ ANGLE_GL_PROGRAM(program, kVS, kFS);
+ glUseProgram(program);
+ GLint posLoc = glGetAttribLocation(program, "position");
+ GLint instLoc = glGetAttribLocation(program, "instance");
+
+ auto quadVertices = GetQuadVertices();
+ GLBuffer posBuf;
+ glBindBuffer(GL_ARRAY_BUFFER, posBuf);
+ glBufferData(GL_ARRAY_BUFFER, quadVertices.size() * sizeof(Vector3), quadVertices.data(),
+ GL_STATIC_DRAW);
+ glEnableVertexAttribArray(posLoc);
+ glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
+
+ const int instanceCount = 1024;
+ const int srcStride = 20; // 20 bytes stride for vec4 (16 bytes) forces slow path
+ std::vector<uint8_t> instData(instanceCount * srcStride, 0);
+ GLBuffer instBuf;
+ glBindBuffer(GL_ARRAY_BUFFER, instBuf);
+ glBufferData(GL_ARRAY_BUFFER, instData.size(), instData.data(), GL_STATIC_DRAW);
+ glEnableVertexAttribArray(instLoc);
+ glVertexAttribPointer(instLoc, 4, GL_FLOAT, GL_FALSE, srcStride, nullptr);
+ glVertexAttribDivisorANGLE(instLoc, 1);
+
+ const int first = 100;
+ // This will trigger the workaround and the overflow if the fix is not present.
+ glDrawArraysInstancedANGLE(GL_TRIANGLES, first, 6, instanceCount);
+ EXPECT_GL_NO_ERROR();
+}
+
+ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(
+ VertexAttributeShiftInstancedArrayDataWithOffsetTest,
+ ES2_OPENGL().enable(Feature::ShiftInstancedArrayDataWithOffset),
+ ES2_OPENGLES().enable(Feature::ShiftInstancedArrayDataWithOffset),
+ ES3_OPENGL().enable(Feature::ShiftInstancedArrayDataWithOffset),
+ ES3_OPENGLES().enable(Feature::ShiftInstancedArrayDataWithOffset));
+
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(
VertexAttributeTest,
ES2_VULKAN().enable(Feature::ForceFallbackFormat),
Original Bug Report
Heap-buffer-overflow in VertexArrayGL::streamAttributes via shiftInstancedArrayDataWithOffset
Steps to reproduce the problem
ASAN_OPTIONS=detect_leaks=0:halt_on_error=1:print_stacktrace=1 \
out/asan/chrome \
--no-sandbox \
--headless=new \
--use-angle=gl \
--ozone-platform=headless \
--no-first-run \
--disable-background-networking \
--disable-sync \
--disable-extensions \
--ignore-gpu-blocklist \
--enable-angle-features=shiftInstancedArrayDataWithOffset \
--virtual-time-budget=20000 \
poc.html
Problem Description
Summary
VertexArrayGL::streamAttributes() in ANGLE’s GL backend allocates a streaming vertex buffer based on ComputeVertexBindingElementCount(), then the shiftInstancedArrayDataWithOffset workaround increases streamedVertexCount after allocation. The slow-path memcpy loop writes past the buffer end. This is a heap-buffer-overflow in the GPU process, reachable from WebGL via drawArraysInstanced with first > 0.
- File:
third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp - Bug lines: 492-496 (count increased), 548-554 (writes with increased count)
- Process: GPU process
- Tested: Chromium 148.0.7762.0 (commit
371e35b061) - Platform: macOS Intel (non-Haswell) by default; reproducible on any platform with
--enable-angle-features=shiftInstancedArrayDataWithOffset
Root Cause
Line 415: computeStreamingAttributeSizes() computes streamingDataSize using the original vertex count from ComputeVertexBindingElementCount().
Line 438: Buffer allocated with original size: bufferData(GL_ARRAY_BUFFER, requiredBufferSize, ...).
Lines 495-496: Workaround increases the vertex count:
streamedVertexCount = (instanceCount + indexRange.start() + adjustedDivisor - 1u) / adjustedDivisor;
Lines 548-554: Slow-path copy loop uses the increased count:
for (size_t vertexIdx = 0; vertexIdx < streamedVertexCount; vertexIdx++) {
uint8_t *out = bufferPointer + curBufferOffset + (destStride * vertexIdx);
const uint8_t *in = inputPointer + sourceStride * (vertexIdx + firstIndexForSeparateCopy);
memcpy(out, in, destStride);
}
With first=100, instanceCount=1024, divisor=1: original count = 1024, new count = 1124. Buffer sized for 1024 vertices, loop writes 1124. Overflow = 100 * destStride bytes.
The slow path is taken when sourceStride != destStride (e.g., vertex attribute with stride=20 for vec4 which packs to 16).
Suggested Fix
In streamAttributes(), after the workaround modifies streamedVertexCount at line 495-496, recompute batchMemcpySize and ensure the buffer allocation at line 438 accounts for the maximum possible vertex count.
Summary
Heap-buffer-overflow in VertexArrayGL::streamAttributes via shiftInstancedArrayDataWithOffset
Custom Questions
Type of crash:
GPU process crash
Crash state:
==500925==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7186c57fd230 at pc 0x631b84c7600b bp 0x7ffc2b03d690 sp 0x7ffc2b03ce50
READ of size 16 at 0x7186c57fd230 thread T0 (chrome)
#0 0x631b84c7600a in __asan_memcpy (/home/calysteon/chromium/src/out/asan/chrome+0x196e900a) (BuildId: 330ba48cdf0bd5aa)
#1 0x6ee6ba61f271 in rx::VertexArrayGL::streamAttributes(gl::Context const*, angle::BitSetT<16ul, unsigned long, unsigned long> const&, int, gl::IndexRange const&, bool) const third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp:553:21
#2 0x6ee6ba61beb5 in rx::VertexArrayGL::syncDrawState(gl::Context const*, angle::BitSetT<16ul, unsigned long, unsigned long> const&, int, int, gl::DrawElementsType, void const*, int, bool, void const**) const third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp:264:27
#3 0x6ee6ba61b6de in rx::VertexArrayGL::syncClientSideData(gl::Context const*, angle::BitSetT<16ul, unsigned long, unsigned long> const&, int, int, int) const third_party/angle/src/libANGLE/renderer/gl/VertexArrayGL.cpp:180:12
#4 0x6ee6ba4e5453 in rx::ContextGL::drawArraysInstanced(gl::Context const*, gl::PrimitiveMode, int, int, int) third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp:266:26
#5 0x6ee6b9f7c6d8 in gl::Context::drawArraysInstanced(gl::PrimitiveMode, int, int, int) third_party/angle/src/libANGLE/Context.cpp:2961:26
#6 0x6ee6b9779072 in GL_DrawArraysInstanced third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp:1132:22
#7 0x631bad5b541d in gpu::gles2::GLES2DecoderImpl::HandleDrawArraysInstancedANGLE(unsigned int, void const volatile*) gpu/command_buffer/service/<gles2_cmd_decoder.cc:9429>:18
#8 0x631bad5fbd19 in gpu::error::Error gpu::gles2::GLES2DecoderImpl::DoCommandsImpl<false>(unsigned int, void const volatile*, int, int*) gpu/command_buffer/service/<gles2_cmd_decoder.cc:4766>:18
#9 0x631b93ed348d in gpu::CommandBufferService::Flush(int, gpu::AsyncAPIInterface*) gpu/command_buffer/service/<command_buffer_service.cc:267>:35
#10 0x631bad49be45 in gpu::CommandBufferStub::OnAsyncFlush(int, unsigned int, std::__Cr::vector<gpu::SyncToken, std::__Cr::allocator<gpu::SyncToken>> const&) gpu/ipc/service/<command_buffer_stub.cc:504>:22
#11 0x631bad49ae36 in gpu::CommandBufferStub::ExecuteDeferredRequest(gpu::mojom::DeferredCommandBufferRequestParams&, gpu::FenceSyncReleaseDelegate*) gpu/ipc/service/<command_buffer_stub.cc:173>:7
#12 0x631bad4c5a1b in gpu::GpuChannel::ExecuteDeferredRequest(mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*) gpu/ipc/service/<gpu_channel.cc:833>:13
#13 0x631bad4d3f17 in void base::internal::DecayedFunctorTraits<void (gpu::GpuChannel::*)(mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*), base::WeakPtr<gpu::GpuChannel>&&, mojo::StructPtr<gpu::mojom::DeferredRequestParams>&&>::Invoke<void (gpu::GpuChannel::*)(mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*), base::WeakPtr<gpu::GpuChannel> const&, mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*>(void (gpu::GpuChannel::*)(mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*), base::WeakPtr<gpu::GpuChannel> const&, mojo::StructPtr<gpu::mojom::DeferredRequestParams>&&, gpu::FenceSyncReleaseDelegate*&&) base/functional/bind_internal.h:740:12
#14 0x631bad4d3cf9 in base::internal::Invoker<base::internal::FunctorTraits<void (gpu::GpuChannel::*&&)(mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*), base::WeakPtr<gpu::GpuChannel>&&, mojo::StructPtr<gpu::mojom::DeferredRequestParams>&&>, base::internal::BindState<true, true, false, void (gpu::GpuChannel::*)(mojo::StructPtr<gpu::mojom::DeferredRequestParams>, gpu::FenceSyncReleaseDelegate*), base::WeakPtr<gpu::GpuChannel>, mojo::StructPtr<gpu::mojom::DeferredRequestParams>>, void (gpu::FenceSyncReleaseDelegate*)>::RunOnce(base::internal::BindStateBase*, gpu::FenceSyncReleaseDelegate*) base/functional/bind_internal.h:956:5
#15 0x631b93f20bb8 in base::OnceCallback<void (gpu::FenceSyncReleaseDelegate*)>::Run(gpu::FenceSyncReleaseDelegate*) && base/functional/callback.h:155:12
#16 0x631b93f2092a in void base::internal::Invoker<base::internal::FunctorTraits<base::OnceCallback<void (gpu::FenceSyncReleaseDelegate*)>&&, gpu::FenceSyncReleaseDelegate*>, base::internal::BindState<false, true, true, base::OnceCallback<void (gpu::FenceSyncReleaseDelegate*)>, base::internal::UnretainedWrapper<gpu::FenceSyncReleaseDelegate, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>>, void ()>::RunImpl<base::OnceCallback<void (gpu::FenceSyncReleaseDelegate*)>, std::__Cr::tuple<base::internal::UnretainedWrapper<gpu::FenceSyncReleaseDelegate, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>>, 0ul>(base::OnceCallback<void (gpu::FenceSyncReleaseDelegate*)>&&, std::__Cr::tuple<base::internal::UnretainedWrapper<gpu::FenceSyncReleaseDelegate, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>>&&, std::__Cr::integer_sequence<unsigned long, 0ul>) base/functional/bind_internal.h:815:49
#17 0x631b85572945 in base::OnceCallback<void ()>::Run() && base/functional/callback.h:155:12
#18 0x631b93eee378 in gpu::Scheduler::ExecuteSequence(base::IdType<gpu::SyncPointOrderData, unsigned int, 0u, 1u>) gpu/command_buffer/service/<scheduler.cc:707>:29
#19 0x631b93eeba79 in gpu::Scheduler::RunNextTask() gpu/command_buffer/service/<scheduler.cc:625>:3
#20 0x631b93ef0af1 in base::internal::Invoker<base::internal::FunctorTraits<void (gpu::Scheduler::*&&)(), gpu::Scheduler*>, base::internal::BindState<true, true, false, void (gpu::Scheduler::*)(), base::internal::UnretainedWrapper<gpu::Scheduler, base::unretained_traits::MayNotDangle, (partition_alloc::internal::RawPtrTraits)0>>, void ()>::RunOnce(base::internal::BindStateBase*) base/functional/bind_internal.h:740:12
#21 0x631b85572945 in base::OnceCallback<void ()>::Run() && base/functional/callback.h:155:12
#22 0x631ba309a7d7 in base::TaskAnnotator::RunTaskImpl(base::PendingTask&) base/task/common/<task_annotator.cc:229>:34
#23 0x631ba314a045 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl(base::LazyNow*) base/task/common/task_annotator.h:112:5
#24 0x631ba31483ed in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() base/task/sequence_manager/<thread_controller_with_message_pump_impl.cc:340>:40
#25 0x631ba2f19d33 in base::MessagePumpDefault::Run(base::MessagePump::Delegate*) base/message_loop/<message_pump_default.cc:42>:55
#26 0x631ba314c442 in base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run(bool, base::TimeDelta) base/task/sequence_manager/<thread_controller_with_message_pump_impl.cc:644>:12
#27 0x631ba2ffc654 in base::RunLoop::Run(base::Location const&) base/<run_loop.cc:135>:14
#28 0x631bafca9c53 in content::GpuMain(content::MainFunctionParams) content/gpu/<gpu_main.cc:484>:14
#29 0x631b9e44968a in content::RunZygote(content::ContentMainDelegate*) content/app/<content_main_runner_impl.cc:664>:14
#30 0x631b9e44ad86 in content::RunOtherNamedProcessTypeMain(std::__Cr::basic_string<char, std::__Cr::char_traits<char>, std::__Cr::allocator<char>> const&, content::MainFunctionParams, content::ContentMainDelegate*) content/app/<content_main_runner_impl.cc:771>:12
#31 0x631b9e44e0cc in content::ContentMainRunnerImpl::Run() content/app/<content_main_runner_impl.cc:1152>:10
#32 0x631b9e447241 in content::RunContentProcess(content::ContentMainParams, content::ContentMainRunner*) content/app/<content_main.cc:358>:36
#33 0x631b9e44783c in content::ContentMain(content::ContentMainParams) content/app/<content_main.cc:371>:10
#34 0x631b84cb2b38 in ChromeMain chrome/app/<chrome_main.cc:191>:12
#35 0x72e6c722a1c9 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#36 0x72e6c722a28a in __libc_start_main csu/../csu/libc-start.c:360:3
SUMMARY: AddressSanitizer: heap-buffer-overflow (/home/calysteon/chromium/src/out/asan/chrome+0x196e900a) (BuildId: 330ba48cdf0bd5aa) in __asan_memcpy
Reporter credit:
Nathaniel Oh (@calysteon)
Additional Data
Category: Security
Chrome Channel: Dev
Regression: N/A \