Coverage Report

Created: 2025-03-04 07:22

/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
867
{
15
867
    if constexpr (!GIF_DEBUG) {
16
867
        AK::set_debug_enabled(false);
17
867
    }
18
867
    auto decoder_or_error = Gfx::GIFImageDecoderPlugin::create({ data, size });
19
867
    if (decoder_or_error.is_error())
20
26
        return 0;
21
841
    auto decoder = decoder_or_error.release_value();
22
841
    auto& gif_decoder = *decoder;
23
841
    auto bitmap_or_error = decoder->frame(0);
24
841
    if (!bitmap_or_error.is_error()) {
25
369
        auto const& bitmap = bitmap_or_error.value().image;
26
        // Looks like a valid GIF. Try to load the other frames:
27
369
        dbgln_if(GIF_DEBUG, "bitmap size: {}", bitmap->size());
28
369
        dbgln_if(GIF_DEBUG, "codec size: {}", gif_decoder.size());
29
369
        dbgln_if(GIF_DEBUG, "is_animated: {}", gif_decoder.is_animated());
30
369
        dbgln_if(GIF_DEBUG, "loop_count: {}", gif_decoder.loop_count());
31
369
        dbgln_if(GIF_DEBUG, "frame_count: {}", gif_decoder.frame_count());
32
114k
        for (size_t i = 0; i < gif_decoder.frame_count(); ++i) {
33
113k
            auto ifd_or_error = gif_decoder.frame(i);
34
113k
            if (ifd_or_error.is_error()) {
35
102
                dbgln_if(GIF_DEBUG, "frame #{} error: {}", i, ifd_or_error.release_error());
36
113k
            } else {
37
113k
                auto ifd = ifd_or_error.release_value();
38
113k
                dbgln_if(GIF_DEBUG, "frame #{} size: {}", i, ifd.image->size());
39
113k
                dbgln_if(GIF_DEBUG, "frame #{} duration: {}", i, ifd.duration);
40
113k
            }
41
113k
        }
42
369
        dbgln_if(GIF_DEBUG, "Done.");
43
369
    }
44
45
841
    return 0;
46
867
}