diff options
author | Jamie Madill <jmadill@chromium.org> | 2022-03-01 15:40:38 -0500 |
---|---|---|
committer | Michael BrĂ¼ning <michael.bruning@qt.io> | 2022-05-24 13:45:15 +0000 |
commit | 3e8444fbf852db7b5470e2088cec378547100215 (patch) | |
tree | 439163c661bf826b7a01720874943b4c7b6c4ee4 | |
parent | 67fc041e76d301756c16858e97ba11db797bd68d (diff) | |
download | qtwebengine-chromium-3e8444fbf852db7b5470e2088cec378547100215.tar.gz |
[Backport] CVE-2022-0976: Heap buffer overflow in GPU
Manual backport of patch originally reviewed on
https://chromium-review.googlesource.com/c/angle/angle/+/3513754:
Vulkan: Fix issue with redefining a layered attachment.
The fix ensures we complete level redefinition before we get the
layer render target in TextureVk::getAttachmentRenderTarget.
Bug: chromium:1296866
Change-Id: I3ebe38f477fbb3eb4f0ad81634ccfb716f1699ca
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp index d3ac999806f..b42f2316fc3 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp @@ -2132,6 +2132,15 @@ angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context, ContextVk *contextVk = vk::GetImpl(context); + if (mRedefinedLevels.any()) + { + // If we have redefined levels, we must flush those out to fix the render targets. + ANGLE_TRY(respecifyImageStorage(contextVk)); + } + + // Otherwise, don't flush staged updates here. We'll handle that in FramebufferVk so we can + // defer clears. + if (!mImage->valid()) { const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc(); @@ -2180,9 +2189,14 @@ angle::Result TextureVk::getAttachmentRenderTarget(const gl::Context *context, ANGLE_TRY(initRenderTargets(contextVk, layerCount, gl::LevelIndex(imageIndex.getLevelIndex()), renderToTextureIndex)); - ASSERT(imageIndex.getLevelIndex() < - static_cast<int32_t>(mRenderTargets[renderToTextureIndex].size())); - *rtOut = &mRenderTargets[renderToTextureIndex][imageIndex.getLevelIndex()][layerIndex]; + std::vector<RenderTargetVector> &levelRenderTargets = + mRenderTargets[renderToTextureIndex]; + ASSERT(imageIndex.getLevelIndex() < static_cast<int32_t>(levelRenderTargets.size())); + + RenderTargetVector &layerRenderTargets = levelRenderTargets[imageIndex.getLevelIndex()]; + ASSERT(imageIndex.getLayerIndex() < static_cast<int32_t>(layerRenderTargets.size())); + + *rtOut = &layerRenderTargets[layerIndex]; return angle::Result::Continue; } |