13#include "third_party/skia/include/core/SkData.h"
21void WriteBE32(std::vector<uint8_t>& buf, uint32_t val) {
22 buf.push_back((val >> 24) & 0xFF);
23 buf.push_back((val >> 16) & 0xFF);
24 buf.push_back((val >> 8) & 0xFF);
25 buf.push_back(val & 0xFF);
29void WriteBE16(std::vector<uint8_t>& buf, uint16_t val) {
30 buf.push_back((val >> 8) & 0xFF);
31 buf.push_back(val & 0xFF);
35void AppendChunk(std::vector<uint8_t>& buf,
37 const std::vector<uint8_t>&
data) {
38 FML_CHECK(
data.size() <= std::numeric_limits<uint32_t>::max());
39 WriteBE32(buf,
static_cast<uint32_t
>(
data.size()));
40 size_t type_start = buf.size();
41 buf.insert(buf.end(),
type,
type + 4);
42 buf.insert(buf.end(),
data.begin(),
data.end());
50void AppendChunkWithFakeLength(std::vector<uint8_t>& buf,
52 uint32_t declared_length,
53 const std::vector<uint8_t>& actual_data) {
54 WriteBE32(buf, declared_length);
55 buf.insert(buf.end(),
type,
type + 4);
56 buf.insert(buf.end(), actual_data.begin(), actual_data.end());
63std::vector<uint8_t> BuildMaliciousApng(uint32_t fdat_data_length) {
69 std::vector<uint8_t> ihdr;
77 AppendChunk(apng,
"IHDR", ihdr);
82 std::vector<uint8_t> actl;
85 AppendChunk(apng,
"acTL", actl);
90 std::vector<uint8_t> fctl;
100 AppendChunk(apng,
"fcTL", fctl);
106 AppendChunk(apng,
"fdAT", std::vector<uint8_t>(fdat_data_length, 0));
109 AppendChunk(apng,
"IEND", {});
118TEST(APNGImageGeneratorTest, FdATWithShortDataLengthDoesNotCrash) {
121 auto make_generator = [](uint32_t fdat_length) ->
auto {
122 auto apng_bytes = BuildMaliciousApng(fdat_length);
123 auto data = SkData::MakeWithCopy(apng_bytes.data(), apng_bytes.size());
128 EXPECT_EQ(make_generator(0),
nullptr);
129 EXPECT_EQ(make_generator(2),
nullptr);
132 EXPECT_NE(make_generator(4),
nullptr);
135TEST(APNGImageGeneratorTest, FdATWithOverflowDataLengthIsRejected) {
141 std::vector<uint8_t> ihdr;
149 AppendChunk(apng,
"IHDR", ihdr);
153 std::vector<uint8_t> actl;
156 AppendChunk(apng,
"acTL", actl);
160 std::vector<uint8_t> fctl;
170 AppendChunk(apng,
"fcTL", fctl);
173 AppendChunkWithFakeLength(apng,
"fdAT", 0xFFFFFFFF, {0, 0, 0, 1, 0, 0, 0, 0});
175 AppendChunk(apng,
"IEND", {});
177 auto data = SkData::MakeWithCopy(apng.data(), apng.size());
180 EXPECT_EQ(generator,
nullptr);
static uint32_t ComputeCrc32(const uint8_t *data, size_t length)
Computes the CRC of the data in a PNG chunk.
static constexpr std::array< uint8_t, 8 > kPngSignature
Signature at the start of a PNG file.
static std::unique_ptr< ImageGenerator > MakeFromData(sk_sp< SkData > data)
Keeps a priority-ordered registry of image generator builders to be used when decoding images....
#define FML_CHECK(condition)
TEST(NativeAssetsManagerTest, NoAvailableAssets)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
impeller::ShaderType type