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 "include/android/SkAnimatedImage.h" 9 #include "include/codec/SkAndroidCodec.h" 10 #include "include/core/SkCanvas.h" 11 #include "include/core/SkData.h" 12 #include "include/core/SkSurface.h" 13 FuzzAnimatedImage(sk_sp<SkData> bytes)14bool 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(SK_BUILD_FOR_LIBFUZZER) LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)40extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 41 if (size > 10240) { 42 return 0; 43 } 44 auto bytes = SkData::MakeWithoutCopy(data, size); 45 FuzzAnimatedImage(bytes); 46 return 0; 47 } 48 #endif 49