Chrome · Skia
CVE-2026-79147
Logic Error in Skia
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifsrc/gpu/ganesh/GrFragmentProcessors.cpp |
modified | |
fortests/ProtectedTest.cpp |
modified |
Files Changed
src/gpu/ganesh/GrFragmentProcessors.cpptests/ProtectedTest.cpp
Patch
From e30d3d14a4c33a4d594fa1a71ab3d4f74b7aeebe Mon Sep 17 00:00:00 2001 From: Robert Phillips <[email protected]> Date: Tue, 30 Jun 2026 17:35:01 +0000 Subject: [PATCH] Propagate protectedness to SkPictureShader draws This change seems harmless and is more correct. Basically, the protected-ness of the backing surface is propagated to the internal image created for a PictureShader. This is relevant if the SkPicture contains protected content. Bug: b/513969378 Change-Id: I9314aca6481850d098bab0515601cca51fb7a00a Reviewed-on: https://skia-review.googlesource.com/c/skia/+/1281217 Reviewed-by: Michael Ludwig <[email protected]> Commit-Queue: Robert Phillips <[email protected]> --- diff --git a/src/gpu/ganesh/GrFragmentProcessors.cpp b/src/gpu/ganesh/GrFragmentProcessors.cpp index 5de0327..bfb26ea 100644 --- a/src/gpu/ganesh/GrFragmentProcessors.cpp +++ b/src/gpu/ganesh/GrFragmentProcessors.cpp @@ -755,7 +755,9 @@ } else { const int msaaSampleCount = 0; const bool createWithMips = false; - const bool kUnprotected = false; + const bool isProtected = + args.fSurfaceDrawContext->asSurfaceProxy()->isProtected() == + GrProtected::kYes; auto image = info.makeImage(SkSurfaces::RenderTarget(ctx, skgpu::Budgeted::kYes, info.imageInfo, @@ -763,7 +765,7 @@ kTopLeft_GrSurfaceOrigin, &info.props, createWithMips, - kUnprotected), + isProtected), shader->picture().get()); if (!image) { return nullptr; diff --git a/tests/ProtectedTest.cpp b/tests/ProtectedTest.cpp index 9f779c6..e3499fb 100644 --- a/tests/ProtectedTest.cpp +++ b/tests/ProtectedTest.cpp @@ -13,6 +13,8 @@ #include "include/core/SkCanvas.h" #include "include/core/SkColorSpace.h" #include "include/core/SkPaint.h" +#include "include/core/SkPicture.h" +#include "include/core/SkPictureRecorder.h" #include "include/core/SkSurface.h" #include "include/gpu/ganesh/GrBackendSurface.h" #include "include/gpu/ganesh/GrDirectContext.h" @@ -230,4 +232,60 @@ REPORTER_ASSERT(reporter, !cbContext.fResult); } +DEF_GANESH_TEST_FOR_ALL_CONTEXTS(Protected_pictureShader, reporter, + ctxInfo, CtsEnforcement::kNever) { + auto dContext = ctxInfo.directContext(); + + if (!dContext->supportsProtectedContent()) { + // Protected content not supported + return; + } + + sk_sp<SkImage> protectedImage = ProtectedUtils::CreateProtectedSkImage(dContext, + { kSize, kSize }, + SkColors::kBlue, + /* isProtected= */ true); + dContext->flushAndSubmit(GrSyncCpu::kYes); + + REPORTER_ASSERT(reporter, protectedImage); + REPORTER_ASSERT(reporter, protectedImage->isProtected()); + + sk_sp<SkPicture> protectedPicture; + { + SkPictureRecorder recorder; + recorder.beginRecording(100, 100)->drawImage(protectedImage.get(), 0, 0); + protectedPicture = recorder.finishRecordingAsPicture(); + REPORTER_ASSERT(reporter, protectedPicture); + } + + SkPaint protectedPaint; + protectedPaint.setShader(protectedPicture->makeShader(SkTileMode::kRepeat, + SkTileMode::kRepeat, + SkFilterMode::kNearest)); + + SkImageInfo ii = SkImageInfo::Make({ kSize, kSize }, + kRGBA_8888_SkColorType, + kPremul_SkAlphaType); + + for (bool isProtected : { true, false }) { + sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(dContext, + skgpu::Budgeted::kNo, + ii, + /* sampleCount= */ 1, + kBottomLeft_GrSurfaceOrigin, + /* surfaceProps= */ nullptr, + /* shouldCreateWithMips= */ false, + isProtected); + + REPORTER_ASSERT(reporter, surface); + + // For the un-protected surface, drawing the SkPicture containing the protected + // image should cause the final draw of the generated image to the surface to fail + // while the generation of the internal (protected) image should succeed. + surface->getCanvas()->drawPaint(protectedPaint); + } + + dContext->flushAndSubmit(GrSyncCpu::kYes); +} + #endif // defined(SK_GANESH)
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