Chrome · GPU
CVE-2026-84351
OOB in GPU
Overview
High
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
gpu/command_buffer/build_cmd_buffer_lib.pygpu/command_buffer/build_gles2_cmd_buffer.pygpu/command_buffer/client/gles2_implementation_impl_autogen.h
Patch
From 6454cd98685d08547fdf80ae56c31267381050ed Mon Sep 17 00:00:00 2001
From: Corentin Wallez <cwallez@chromium.org>
Date: Wed, 26 Aug 2026 09:58:29 -0700
Subject: [PATCH] gles2_implementation: Clamp the number of values returned by glGet*
glGet*'s autogen implementation reads the number of bytes returned by
the GPU process and writes them directly to the return pointer, without
checking that it matches the number of parameters for the given `pname`.
Modify build_cmd_buffer_lib so that in gles2_implementation_impl_autogen.cc,
GLES2Util::GLGetNumValuesReturned is used to clamp the number of returned
results.
Other required changes:
- Add more cases to GLES2Util::GLGetNumValuesReturned to cover all the
enums that the gles2_cmd_decoder may handle.
- Modify the codegen of gles2_implementation_unittest_autogen.h to use
a real uncached pname for "ValidNonCached" parameters.
- Update PixelLocalStorage function definition in the GLES2 command
decoder to use a "named enum set" similarly to all other glGet*. This
also changes the gles2_cmd_decoder autogen files in a noop way
because PLS is only exposed via the passthrough command decoder.
- Adds a test of glGetShaderiv that would fail without the fix.
Fixed: 551593376
Change-Id: I0db53a77709f2a51de203923cb306a2f414039c3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8285102
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1686513}
---
diff --git a/gpu/command_buffer/build_cmd_buffer_lib.py b/gpu/command_buffer/build_cmd_buffer_lib.py
index 7c8b303..f6f420f 100644
--- a/gpu/command_buffer/build_cmd_buffer_lib.py
+++ b/gpu/command_buffer/build_cmd_buffer_lib.py
@@ -2883,6 +2883,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(%(last_arg_name)s);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -5009,6 +5015,14 @@
index = func.GetCmdArgs().index(self)
return str(index + 1)
+ def GetValidNonCachedClientSideArg(self, _):
+ """Return a glGet pname so that GLES2Util::GLGetNumValuesReturned returns
+ 1, but that is also not cached on the GLES2Implementation"""
+ return 'GL_COMPILE_STATUS'
+
+ def GetValidNonCachedClientSideCmdArg(self, func):
+ return self.GetValidNonCachedClientSideArg(func)
+
def GetValidGLArg(self, func):
"""Gets a valid value for this argument."""
return self.GetValidArg(func)
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 7a161dd..3510b07 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -1549,6 +1549,22 @@
'GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM',
],
},
+ 'FramebufferPixelLocalStorageParameter': {
+ 'type': 'GLenum',
+ 'valid': [
+ 'GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE',
+ 'GL_MAX_COMBINED_DRAW_BUFFERS_AND_PIXEL_LOCAL_STORAGE_PLANES_ANGLE',
+ 'GL_PIXEL_LOCAL_STORAGE_ACTIVE_PLANES_ANGLE',
+ 'GL_PIXEL_LOCAL_INTERNAL_FORMAT_ANGLE',
+ 'GL_PIXEL_LOCAL_TEXTURE_NAME_ANGLE',
+ 'GL_PIXEL_LOCAL_TEXTURE_LEVEL_ANGLE',
+ 'GL_PIXEL_LOCAL_TEXTURE_LAYER_ANGLE',
+ 'GL_PIXEL_LOCAL_USAGE_ANGLE',
+ 'GL_PIXEL_LOCAL_CLEAR_VALUE_FLOAT_ANGLE',
+ 'GL_PIXEL_LOCAL_CLEAR_VALUE_INT_ANGLE',
+ 'GL_PIXEL_LOCAL_CLEAR_VALUE_UNSIGNED_INT_ANGLE',
+ ],
+ },
}
# A function info object specifies the type and other special data for the
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
index f84de15..4c9d45d 100644
--- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -884,6 +884,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -915,6 +921,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -947,6 +959,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -974,6 +992,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -1011,6 +1035,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -1038,6 +1068,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -1068,6 +1104,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(data);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -1097,6 +1139,12 @@
if (!WaitForCmd()) {
return;
}
+
+ int expected_num_results = util_.GLGetNumValuesReturned(pname);
+ DCHECK(expected_num_results != 0) << pname;
+ result->SetNumResults(
+ std::min(result->GetNumResults(), expected_num_results));
+
result->CopyResult(data);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32_t i = 0; i < result->GetNumResults(); ++i) {
@@ -1125,6 +1173,12 @@
Loading diff…
Regression Test / PoC
shipped with the fix
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index 0de18a57..610de552 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -810,6 +810,31 @@
EXPECT_EQ(buf[sizeof(kString)], kBad);
}
+// Check that for GETn functions (like glShaderiv) the writes to the result
+// pointer are clamped even if the service side returns more data. See
+// http://issues.chromium.org/issues/551593376.
+TEST_F(GLES2ImplementationTest, GetShaderiv_OversizeReturn) {
+ // Make the SizedResult hold two GLints instead of the single one for
+ // GL_SHADER_TYPE.
+ struct TwoInts {
+ GLint first = 0xBEEF;
+ GLint second = 0xCAFE;
+ };
+
+ ExpectedMemoryInfo resultBuffer =
+ GetExpectedResultMemory(sizeof(uint32_t) + sizeof(TwoInts));
+ EXPECT_CALL(*command_buffer(), OnFlush())
+ .WillOnce(SetMemory(resultBuffer.ptr, SizedResultHelper<TwoInts>({})))
+ .RetiresOnSaturation();
+
+ std::array<GLint, 2> resultAndGuard = {{0, 0}};
+ gl_->GetShaderiv(123, GL_SHADER_TYPE, resultAndGuard.data());
+
+ // Only the first GLint should be written to the output.
+ EXPECT_EQ(0xBEEF, resultAndGuard[0]);
+ EXPECT_EQ(0, resultAndGuard[1]);
+}
+
TEST_F(GLES2ImplementationTest, ReadPixels2Reads) {
struct Cmds {
cmds::ReadPixels read1;
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
index 3a6b1e1..f91f16a 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -662,11 +662,11 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, result1.id, result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetBooleanv(123, &result);
+ gl_->GetBooleanv(GL_COMPILE_STATUS, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -680,11 +680,12 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, GL_BUFFER_SIZE, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, GL_BUFFER_SIZE, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetBufferParameteri64v(123, GL_BUFFER_SIZE, &result);
+ gl_->GetBufferParameteri64v(GL_COMPILE_STATUS, GL_BUFFER_SIZE, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -698,11 +699,12 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, GL_BUFFER_SIZE, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, GL_BUFFER_SIZE, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetBufferParameteriv(123, GL_BUFFER_SIZE, &result);
+ gl_->GetBufferParameteriv(GL_COMPILE_STATUS, GL_BUFFER_SIZE, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -716,11 +718,11 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, result1.id, result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetFloatv(123, &result);
+ gl_->GetFloatv(GL_COMPILE_STATUS, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -734,15 +736,15 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, GL_COLOR_ATTACHMENT0,
+ expected.cmd.Init(GL_COMPILE_STATUS, GL_COLOR_ATTACHMENT0,
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, result1.id,
result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
gl_->GetFramebufferAttachmentParameteriv(
- 123, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,
- &result);
+ GL_COMPILE_STATUS, GL_COLOR_ATTACHMENT0,
+ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -756,11 +758,11 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, result1.id, result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetInteger64v(123, &result);
+ gl_->GetInteger64v(GL_COMPILE_STATUS, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -774,11 +776,11 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, 2, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, 2, result1.id, result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetIntegeri_v(123, 2, &result);
+ gl_->GetIntegeri_v(GL_COMPILE_STATUS, 2, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -792,11 +794,11 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, 2, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, 2, result1.id, result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetInteger64i_v(123, 2, &result);
+ gl_->GetInteger64i_v(GL_COMPILE_STATUS, 2, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -810,11 +812,11 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, result1.id, result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetIntegerv(123, &result);
+ gl_->GetIntegerv(GL_COMPILE_STATUS, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -846,11 +848,13 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, GL_RENDERBUFFER_RED_SIZE, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, GL_RENDERBUFFER_RED_SIZE, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetRenderbufferParameteriv(123, GL_RENDERBUFFER_RED_SIZE, &result);
+ gl_->GetRenderbufferParameteriv(GL_COMPILE_STATUS, GL_RENDERBUFFER_RED_SIZE,
+ &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -937,11 +941,12 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, GL_TEXTURE_MAG_FILTER, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, GL_TEXTURE_MAG_FILTER, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetTexParameterfv(123, GL_TEXTURE_MAG_FILTER, &result);
+ gl_->GetTexParameterfv(GL_COMPILE_STATUS, GL_TEXTURE_MAG_FILTER, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -955,11 +960,12 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, GL_TEXTURE_MAG_FILTER, result1.id, result1.offset);
+ expected.cmd.Init(GL_COMPILE_STATUS, GL_TEXTURE_MAG_FILTER, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetTexParameteriv(123, GL_TEXTURE_MAG_FILTER, &result);
+ gl_->GetTexParameteriv(GL_COMPILE_STATUS, GL_TEXTURE_MAG_FILTER, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -3083,11 +3089,13 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, 2, result1.id, result1.offset);
+ expected.cmd.Init(123, GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetFramebufferPixelLocalStorageParameterfvANGLE(123, 2, &result);
+ gl_->GetFramebufferPixelLocalStorageParameterfvANGLE(
+ 123, GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -3103,11 +3111,13 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, 2, result1.id, result1.offset);
+ expected.cmd.Init(123, GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetFramebufferPixelLocalStorageParameterivANGLE(123, 2, &result);
+ gl_->GetFramebufferPixelLocalStorageParameterivANGLE(
+ 123, GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
@@ -3123,11 +3133,13 @@
Cmds expected;
ExpectedMemoryInfo result1 =
GetExpectedResultMemory(sizeof(uint32_t) + sizeof(ResultType));
- expected.cmd.Init(123, 2, result1.id, result1.offset);
+ expected.cmd.Init(123, GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE, result1.id,
+ result1.offset);
EXPECT_CALL(*command_buffer(), OnFlush())
.WillOnce(SetMemory(result1.ptr, SizedResultHelper<ResultType>(1)))
.RetiresOnSaturation();
- gl_->GetFramebufferPixelLocalStorageParameteruivANGLE(123, 2, &result);
+ gl_->GetFramebufferPixelLocalStorageParameteruivANGLE(
+ 123, GL_MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE, &result);
EXPECT_EQ(0, UNSAFE_TODO(memcmp(&expected, commands_, sizeof(expected))));
EXPECT_EQ(static_cast<ResultType>(1), result);
}
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