summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Lang <geofflang@chromium.org>2023-03-10 13:48:03 -0500
committerMichael BrĂ¼ning <michael.bruning@qt.io>2023-04-04 11:26:48 +0000
commit7d80d640bf7263e1110442cc90299f2355c4b562 (patch)
tree544639ffc25ecc9626eae96d7da30a675ccba9b4
parent906ec4b3148e569a3d0bfb7fa5c4ac8647b07d17 (diff)
downloadqtwebengine-chromium-7d80d640bf7263e1110442cc90299f2355c4b562.tar.gz
[Backport] CVE-2023-1531: Use after free in ANGLE
Manual cherry-pick of patch originally reviewed on xhttps://chromium-review.googlesource.com/c/angle/angle/+/4348337: M112: 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/+/4348337 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/469850 Reviewed-by: Michal Klocek <michal.klocek@qt.io>
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp59
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h10
2 files changed, 67 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 7369cf430aa..a891d3d69e8 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
@@ -1610,7 +1610,8 @@ TextureStorage11_External::TextureStorage11_External(
Renderer11 *renderer,
egl::Stream *stream,
const egl::Stream::GLTextureDescription &glDesc)
- : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat)
+ : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat),
+ mAssociatedImage(nullptr)
{
ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11Texture);
auto *producer = static_cast<StreamProducerD3DTexture *>(stream->getImplementation());
@@ -1636,6 +1637,14 @@ 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;
}
@@ -1832,7 +1841,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);
@@ -1844,6 +1854,18 @@ 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
@@ -2056,6 +2078,39 @@ angle::Result TextureStorage11_EGLImage::getImageRenderTarget(const gl::Context
return angle::Result::Continue;
}
+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 b067444c329..5fee8be7588 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
@@ -473,6 +473,8 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase
RenderTarget11 *renderTarget11);
~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;
@@ -498,6 +500,13 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase
angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
bool useLevelZeroTexture) 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;
@@ -525,6 +534,7 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase
// Swizzle-related variables
TextureHelper11 mSwizzleTexture;
std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets;
+ Image11 *mAssociatedImage;
};
class TextureStorage11_Cube : public TextureStorage11