| /* | |
| * Copyright 2025 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkBitmap.h" | |
| #include "include/core/SkData.h" | |
| #include "include/core/SkStream.h" | |
| #include "include/codec/SkBmpRustDecoder.h" | |
| bool FuzzBMPRustDecoder(const uint8_t* data, size_t size) { | |
| if (size == 0) { | |
| return false; | |
| } | |
| auto stream = std::make_unique<SkMemoryStream>(data, size, false); | |
| SkCodec::Result result; | |
| std::unique_ptr<SkCodec> codec = SkBmpRustDecoder::Decode(std::move(stream), &result); | |
| if (!codec || result != SkCodec::kSuccess) { | |
| return false; | |
| } | |
| SkImageInfo info = codec->getInfo(); | |
| SkBitmap bitmap; | |
| if (!bitmap.tryAllocPixels(info)) { | |
| return false; | |
| } | |
| // Attempt to decode the image | |
| (void)codec->getPixels(info, bitmap.getPixels(), bitmap.rowBytes()); | |
| // We don't care if the decode succeeds or fails - we just want to make sure it doesn't crash | |
| return true; | |
| } | |
| #if defined(SK_BUILD_FOR_LIBFUZZER) | |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
| // Limit input size to prevent timeouts | |
| if (size > 10240) { | |
| return 0; | |
| } | |
| FuzzBMPRustDecoder(data, size); | |
| return 0; | |
| } | |
| #endif |