Index: src/core/SkColorSpace_ICC.cpp |
diff --git a/src/core/SkColorSpace_ICC.cpp b/src/core/SkColorSpace_ICC.cpp |
index b33e6b5ba19bad70d7c32352fb403f1f71bdbf25..3895e47b0eb4b7bf8a73b95b53e7597e80c8fae3 100644 |
--- a/src/core/SkColorSpace_ICC.cpp |
+++ b/src/core/SkColorSpace_ICC.cpp |
@@ -110,7 +110,7 @@ struct ICCProfileHeader { |
} |
bool valid() const { |
- return_if_false(fSize >= kICCHeaderSize, "Size is too small"); |
+ SkASSERT(fSize >= kICCHeaderSize); |
uint8_t majorVersion = fVersion >> 24; |
return_if_false(majorVersion <= 4, "Unsupported version"); |
@@ -149,6 +149,7 @@ struct ICCProfileHeader { |
color_space_almost_equal(SkFixedToFloat(fIlluminantXYZ[2]), 0.82491f), |
"Illuminant must be D50"); |
+ // Arbitrary, but there's no reason to exceed 100 tags. |
return_if_false(fTagCount <= 100, "Too many tags"); |
return true; |
@@ -291,6 +292,13 @@ static SkGammas::Type parse_gamma(SkGammas::Data* outData, SkColorSpaceTransferF |
case kTAG_CurveType: { |
uint32_t count = read_big_endian_u32(src + 8); |
+ // This is arbitrary, but one million entries is more than enough for a table. |
+ static constexpr size_t kMaxGammaTableSize = 2 << 20; |
+ if (count > kMaxGammaTableSize) { |
+ SkColorSpacePrintf("Gamma table too large"); |
+ return SkGammas::Type::kNone_Type; |
+ } |
+ |
// tagBytes = 12 + 2 * count |
// We need to do safe addition here to avoid integer overflow. |
if (!safe_add(count, count, &tagBytes) || |
@@ -873,7 +881,10 @@ static bool tag_equals(const ICCTag* a, const ICCTag* b, const uint8_t* base) { |
} |
sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) { |
- if (!input || len < kICCHeaderSize) { |
+ // This is arbitrary, but there's no need for a sane profile to exceed 4 MB. |
+ static constexpr size_t kMaxICCSize = 2 << 22; |
+ |
+ if (!input || kICCHeaderSize > len || len > kMaxICCSize) { |
return_null("Data is null or not large enough to contain an ICC profile"); |
} |