diff options
author | Geoff Lang <geofflang@chromium.org> | 2023-03-10 13:48:03 -0500 |
---|---|---|
committer | Michael BrĂ¼ning <michael.bruning@qt.io> | 2023-03-24 10:08:32 +0000 |
commit | 6597245068e3f748a654f88b7ed56fe6e5056ee8 (patch) | |
tree | f5ef33ed31ff0125b37a6f3eeb7b8361338cecad | |
parent | 4308208812a2b3e9af9c6c15d32e0f76f3edf629 (diff) | |
download | qtwebengine-chromium-6597245068e3f748a654f88b7ed56fe6e5056ee8.tar.gz |
[Backport] CVE-2023-1531: Use after free in ANGLE
Cherry-pick of patch originally reviewed on
https://chromium-review.googlesource.com/c/angle/angle/+/4348335:
M110: D3D11: Add logic to disassociate EGL image storages.
The TextureStorage classes for External and EGLImages were missing the
logic to disassociate from images. This lead to the images continuing
to hold references to deleted storages.
Bug: chromium:1415330
Change-Id: I8303f6751d87a9b0a52993c7d4e9509b086b93f3
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4328347
Reviewed-by: Peng Huang <penghuang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
(cherry picked from commit a8720455fda43167465c3d2f9a13fca60c21f56e)
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4348335
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/468614
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp | 65 | ||||
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h | 11 |
2 files changed, 74 insertions, 2 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp index fa1adda790d..4d25a2eb873 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp +++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp @@ -1634,7 +1634,8 @@ TextureStorage11_External::TextureStorage11_External( egl::Stream *stream, const egl::Stream::GLTextureDescription &glDesc, const std::string &label) - : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat, label) + : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat, label), + mAssociatedImage(nullptr) { ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11Texture); auto *producer = static_cast<StreamProducerD3DTexture *>(stream->getImplementation()); @@ -1660,6 +1661,15 @@ angle::Result TextureStorage11_External::onDestroy(const gl::Context *context) mRenderer->getStateManager()->invalidateBoundViews(); } + if (mAssociatedImage != nullptr) + { + mAssociatedImage->verifyAssociatedStorageValid(this); + + // We must let the Images recover their data before we delete it from the + // TextureStorage. + ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); + } + return angle::Result::Continue; } @@ -1867,7 +1877,8 @@ TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, mImage(eglImage), mCurrentRenderTarget(0), mSwizzleTexture(), - mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) + mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS), + mAssociatedImage(nullptr) { mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11); @@ -1879,6 +1890,20 @@ TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, TextureStorage11_EGLImage::~TextureStorage11_EGLImage() {} +angle::Result TextureStorage11_EGLImage::onDestroy(const gl::Context *context) +{ + if (mAssociatedImage != nullptr) + { + mAssociatedImage->verifyAssociatedStorageValid(this); + + // We must let the Images recover their data before we delete it from the + // TextureStorage. + ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); + } + + return angle::Result::Continue; +} + angle::Result TextureStorage11_EGLImage::getSubresourceIndex(const gl::Context *context, const gl::ImageIndex &index, UINT *outSubresourceIndex) const @@ -2099,6 +2124,42 @@ void TextureStorage11_EGLImage::onLabelUpdate() } } +void TextureStorage11_EGLImage::associateImage(Image11 *image, const gl::ImageIndex &index) +{ + ASSERT(index.getLevelIndex() == 0); + mAssociatedImage = image; +} + +void TextureStorage11_EGLImage::verifyAssociatedImageValid(const gl::ImageIndex &index, + Image11 *expectedImage) +{ + ASSERT(index.getLevelIndex() == 0 && mAssociatedImage == expectedImage); +} + +void TextureStorage11_EGLImage::disassociateImage(const gl::ImageIndex &index, + Image11 *expectedImage) +{ + ASSERT(index.getLevelIndex() == 0); + ASSERT(mAssociatedImage == expectedImage); + mAssociatedImage = nullptr; +} + +angle::Result TextureStorage11_EGLImage::releaseAssociatedImage(const gl::Context *context, + const gl::ImageIndex &index, + Image11 *incomingImage) +{ + ASSERT(index.getLevelIndex() == 0); + + if (mAssociatedImage != nullptr && mAssociatedImage != incomingImage) + { + mAssociatedImage->verifyAssociatedStorageValid(this); + + ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); + } + + return angle::Result::Continue; +} + TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h index aee7c432543..71a936f5178 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h +++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h @@ -483,6 +483,8 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase const std::string &label); ~TextureStorage11_EGLImage() override; + angle::Result onDestroy(const gl::Context *context) override; + angle::Result getSubresourceIndex(const gl::Context *context, const gl::ImageIndex &index, UINT *outSubresourceIndex) const override; @@ -509,6 +511,13 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase bool useLevelZeroTexture) override; void onLabelUpdate() override; + void associateImage(Image11 *image, const gl::ImageIndex &index) override; + void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; + void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; + angle::Result releaseAssociatedImage(const gl::Context *context, + const gl::ImageIndex &index, + Image11 *incomingImage) override; + protected: angle::Result getSwizzleTexture(const gl::Context *context, const TextureHelper11 **outTexture) override; @@ -536,6 +545,8 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase // Swizzle-related variables TextureHelper11 mSwizzleTexture; std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets; + + Image11 *mAssociatedImage; }; class TextureStorage11_Cube : public TextureStorage11 |