|
@@ -0,0 +1,68 @@
|
|
|
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
+From: Justin Novosad <[email protected]>
|
|
|
+Date: Thu, 2 Jun 2022 19:35:57 +0000
|
|
|
+Subject: PaintOpReader: Harden PaintImage deserialization
|
|
|
+
|
|
|
+This fix prevents the deserialization of PaintImage pixel data from
|
|
|
+reading data out of bounds when the block of serialized pixel data isn't
|
|
|
+large enough to cover the expected amount of data, given the size and
|
|
|
+format of the image.
|
|
|
+
|
|
|
+(cherry picked from commit e89ea1489429a9a9e49e70d5d4e8d018fbafb6ac)
|
|
|
+
|
|
|
+Bug: 1325298
|
|
|
+Change-Id: Icbeb405d2031d7d8ce4537836d7996ce7885f6d1
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3669596
|
|
|
+Commit-Queue: Justin Novosad <[email protected]>
|
|
|
+Reviewed-by: Jonathan Ross <[email protected]>
|
|
|
+Cr-Original-Commit-Position: refs/heads/main@{#1007804}
|
|
|
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3687975
|
|
|
+Bot-Commit: Rubber Stamper <[email protected]>
|
|
|
+Reviewed-by: Justin Novosad <[email protected]>
|
|
|
+Auto-Submit: Srinivas Sista <[email protected]>
|
|
|
+Commit-Queue: Srinivas Sista <[email protected]>
|
|
|
+Cr-Commit-Position: refs/branch-heads/5005@{#1093}
|
|
|
+Cr-Branched-From: 5b4d9450fee01f821b6400e947b3839727643a71-refs/heads/main@{#992738}
|
|
|
+
|
|
|
+diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
|
|
|
+index d71230cfc47944ca538ec8e007f652640e752b63..e34a5fb540dfa2626ab4d0a655e4ba85aa2b8921 100644
|
|
|
+--- a/cc/paint/paint_op_reader.cc
|
|
|
++++ b/cc/paint/paint_op_reader.cc
|
|
|
+@@ -329,6 +329,10 @@ void PaintOpReader::Read(PaintImage* image) {
|
|
|
+
|
|
|
+ SkImageInfo image_info =
|
|
|
+ SkImageInfo::Make(width, height, color_type, kPremul_SkAlphaType);
|
|
|
++ if (pixel_size < image_info.computeMinByteSize()) {
|
|
|
++ SetInvalid(DeserializationError::kInsufficientPixelData);
|
|
|
++ return;
|
|
|
++ }
|
|
|
+ const volatile void* pixel_data = ExtractReadableMemory(pixel_size);
|
|
|
+ if (!valid_)
|
|
|
+ return;
|
|
|
+diff --git a/cc/paint/paint_op_reader.h b/cc/paint/paint_op_reader.h
|
|
|
+index 201cdfde5eea3a07e31a3d6a50a5119485d5c1fc..af784145a9365ea2f776a1020145c0b83c63f16d 100644
|
|
|
+--- a/cc/paint/paint_op_reader.h
|
|
|
++++ b/cc/paint/paint_op_reader.h
|
|
|
+@@ -180,8 +180,9 @@ class CC_PAINT_EXPORT PaintOpReader {
|
|
|
+ kSharedImageProviderNoAccess = 50,
|
|
|
+ kSharedImageProviderSkImageCreationFailed = 51,
|
|
|
+ kZeroSkColorFilterBytes = 52,
|
|
|
++ kInsufficientPixelData = 53,
|
|
|
+
|
|
|
+- kMaxValue = kZeroSkColorFilterBytes,
|
|
|
++ kMaxValue = kInsufficientPixelData
|
|
|
+ };
|
|
|
+
|
|
|
+ template <typename T>
|
|
|
+diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
|
|
|
+index 5faaf3cfd3c0231ad34f651023aeec5d74d9c19b..e15f292c099cfc8bf9cb8613f73517f2f241d91f 100644
|
|
|
+--- a/tools/metrics/histograms/enums.xml
|
|
|
++++ b/tools/metrics/histograms/enums.xml
|
|
|
+@@ -66406,6 +66406,7 @@ Called by update_net_trust_anchors.py.-->
|
|
|
+ <int value="50" label="SharedImageProvider no access"/>
|
|
|
+ <int value="51" label="SharedImageProvider SkImage creation failed"/>
|
|
|
+ <int value="52" label="Zero SkColorFilter bytes"/>
|
|
|
++ <int value="53" label="Insufficient Pixel Data"/>
|
|
|
+ </enum>
|
|
|
+
|
|
|
+ <enum name="PaletteModeCancelType">
|