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());
51std::vector<uint8_t> BuildMaliciousApng(uint32_t fdat_data_length) {
57 std::vector<uint8_t> ihdr;
65 AppendChunk(apng,
"IHDR", ihdr);
70 std::vector<uint8_t> actl;
73 AppendChunk(apng,
"acTL", actl);
78 std::vector<uint8_t> fctl;
88 AppendChunk(apng,
"fcTL", fctl);
94 AppendChunk(apng,
"fdAT", std::vector<uint8_t>(fdat_data_length, 0));
97 AppendChunk(apng,
"IEND", {});
106TEST(APNGImageGeneratorTest, FdATWithShortDataLengthDoesNotCrash) {
109 auto make_generator = [](uint32_t fdat_length) ->
auto {
110 auto apng_bytes = BuildMaliciousApng(fdat_length);
111 auto data = SkData::MakeWithCopy(apng_bytes.data(), apng_bytes.size());
116 EXPECT_EQ(make_generator(0),
nullptr);
117 EXPECT_EQ(make_generator(2),
nullptr);
120 EXPECT_NE(make_generator(4),
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