Coverage Report

Created: 2025-09-05 06:52

/src/serenity/Meta/Lagom/Fuzzers/FuzzGIFLoader.cpp
Line
Count
Source
1
/*
2
 * Copyright (c) 2020, the SerenityOS developers.
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 */
6
7
#include <AK/Debug.h>
8
#include <AK/Format.h>
9
#include <LibGfx/ImageFormats/GIFLoader.h>
10
#include <stddef.h>
11
#include <stdint.h>
12
13
extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size)
14
845
{
15
845
    if constexpr (!GIF_DEBUG) {
16
845
        AK::set_debug_enabled(false);
17
845
    }
18
845
    auto decoder_or_error = Gfx::GIFImageDecoderPlugin::create({ data, size });
19
845
    if (decoder_or_error.is_error())
20
39
        return 0;
21
806
    auto decoder = decoder_or_error.release_value();
22
806
    auto& gif_decoder = *decoder;
23
806
    auto bitmap_or_error = decoder->frame(0);
24
806
    if (!bitmap_or_error.is_error()) {
25
372
        auto const& bitmap = bitmap_or_error.value().image;
26
        // Looks like a valid GIF. Try to load the other frames:
27
372
        dbgln_if(GIF_DEBUG, "bitmap size: {}", bitmap->size());
28
372
        dbgln_if(GIF_DEBUG, "codec size: {}", gif_decoder.size());
29
372
        dbgln_if(GIF_DEBUG, "is_animated: {}", gif_decoder.is_animated());
30
372
        dbgln_if(GIF_DEBUG, "loop_count: {}", gif_decoder.loop_count());
31
372
        dbgln_if(GIF_DEBUG, "frame_count: {}", gif_decoder.frame_count());
32
180k
        for (size_t i = 0; i < gif_decoder.frame_count(); ++i) {
33
180k
            auto ifd_or_error = gif_decoder.frame(i);
34
180k
            if (ifd_or_error.is_error()) {
35
105
                dbgln_if(GIF_DEBUG, "frame #{} error: {}", i, ifd_or_error.release_error());
36
180k
            } else {
37
180k
                auto ifd = ifd_or_error.release_value();
38
180k
                dbgln_if(GIF_DEBUG, "frame #{} size: {}", i, ifd.image->size());
39
180k
                dbgln_if(GIF_DEBUG, "frame #{} duration: {}", i, ifd.duration);
40
180k
            }
41
180k
        }
42
372
        dbgln_if(GIF_DEBUG, "Done.");
43
372
    }
44
45
806
    return 0;
46
845
}