Chrome · GPU
CVE-2026-17949
Uninitialized Memory in GPU
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
gpu/command_buffer/service/gles2_cmd_decoder.ccgpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
Patch
From 557967a618dceaa36bf5620ff0e4135d9b2959f4 Mon Sep 17 00:00:00 2001 From: Zhenyao Mo <[email protected]> Date: Mon, 08 Jun 2026 14:57:40 -0700 Subject: [PATCH] gpu: Fix ClearLevel3D uninitialized memory exposure under OOM glBufferData() may fail with GL_OUT_OF_MEMORY under VRAM pressure, leaving the PBO without a data store and causing subsequent calls to glTexSubImage3D to fail GL_INVALID_OPERATION without writing zeros. Returning true in this case erroneously reports the texture level as cleared, exposing uninitialized memory. This CL drains driver errors before the clear sequence and checks for any errors afterward, returning false if any error occurred so that the level is not marked as cleared. Bug: 517000034 Change-Id: I3ec7dc0b667dfec9e4df0d69d7875bf66cc4eedc Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7902883 Auto-Submit: Zhenyao Mo <[email protected]> Reviewed-by: Geoff Lang <[email protected]> Commit-Queue: Geoff Lang <[email protected]> Cr-Commit-Position: refs/heads/main@{#1643473} --- diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 7b387bf..f8dddd5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -12310,6 +12310,10 @@ TRACE_EVENT1("gpu", "GLES2DecoderImpl::ClearLevel3D", "size", size); + // Drain any pre-existing driver errors so the post-upload check below only + // reflects errors generated by this clear sequence. + LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glClearLevel3D"); + { ScopedPixelUnpackState reset_restore(&state_); GLuint buffer_id = 0; @@ -12339,6 +12343,15 @@ texture_manager()->GetTextureInfoForTarget(&state_, texture->target()); api()->glBindTextureFn(texture->target(), bound_texture ? bound_texture->service_id() : 0); + + // glBufferData() may fail with GL_OUT_OF_MEMORY under VRAM pressure, leaving + // the PBO without a data store and causing every glTexSubImage3D above to + // fail GL_INVALID_OPERATION without writing zeros. Do not report the level as + // cleared in that case; routing the error through PeekGLError also ensures + // OnOutOfMemoryError() fires so lose_context_when_out_of_memory_ applies. + if (LOCAL_PEEK_GL_ERROR("glClearLevel3D") != GL_NO_ERROR) { + return false; + } return true; } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 32589d7..d828410 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -803,6 +803,9 @@ base::span<GLsizei> depth, GLuint bound_pixel_unpack_buffer) { InSequence seq; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_ALIGNMENT, 1)) .Times(1) .RetiresOnSaturation(); @@ -852,6 +855,9 @@ .RetiresOnSaturation(); } EXPECT_CALL(*gl_, BindTexture(target, _)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); } void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
Loading diff…
Regression Test / PoC
shipped with the fix
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
index 32589d7..d828410 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -803,6 +803,9 @@
base::span<GLsizei> depth,
GLuint bound_pixel_unpack_buffer) {
InSequence seq;
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_ALIGNMENT, 1))
.Times(1)
.RetiresOnSaturation();
@@ -852,6 +855,9 @@
.RetiresOnSaturation();
}
EXPECT_CALL(*gl_, BindTexture(target, _)).Times(1).RetiresOnSaturation();
+ EXPECT_CALL(*gl_, GetError())
+ .WillOnce(Return(GL_NO_ERROR))
+ .RetiresOnSaturation();
}
void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
Loading diff…
Original Bug Report
The reporter's bug is still restricted on the tracker. Chrome de-restricts security bugs ~30–90 days after the fix ships; a later run will backfill it here.
References
On This Page