1 /* 2 * Copyright 2018 Google, LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkAndroidCodec.h" 9 #include "SkAnimatedImage.h" 10 #include "SkCanvas.h" 11 #include "SkData.h" 12 #include "SkSurface.h" 13 14 bool FuzzAnimatedImage(sk_sp<SkData> bytes) { 15 auto codec = SkAndroidCodec::MakeFromData(bytes); 16 if (nullptr == codec) { 17 return false; 18 } 19 auto aImg = SkAnimatedImage::Make(std::move(codec)); 20 if (nullptr == aImg) { 21 return false; 22 } 23 24 auto s = SkSurface::MakeRasterN32Premul(128, 128); 25 if (!s) { 26 // May return nullptr in memory-constrained fuzzing environments 27 return false; 28 } 29 30 int escape = 0; 31 while (!aImg->isFinished() && escape < 100) { 32 aImg->draw(s->getCanvas()); 33 escape++; 34 aImg->decodeNextFrame(); 35 } 36 return true; 37 } 38 39 #if defined(IS_FUZZING_WITH_LIBFUZZER) 40 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 41 auto bytes = SkData::MakeWithoutCopy(data, size); 42 FuzzAnimatedImage(bytes); 43 return 0; 44 } 45 #endif 46