Coverage Report

Created: 2025-12-18 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Meta/Lagom/Fuzzers/AudioFuzzerCommon.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
3
 * Copyright (c) 2023, kleines Filmröllchen <filmroellchen@serenityos.org>
4
 * Copyright (c) 2021-2023, the SerenityOS developers.
5
 *
6
 * SPDX-License-Identifier: BSD-2-Clause
7
 */
8
9
#pragma once
10
11
#include <AK/Concepts.h>
12
#include <AK/MemoryStream.h>
13
#include <LibAudio/Loader.h>
14
#include <stddef.h>
15
#include <stdint.h>
16
17
template<typename LoaderPluginType>
18
requires(IsBaseOf<Audio::LoaderPlugin, LoaderPluginType>)
19
int fuzz_audio_loader(uint8_t const* data, size_t size)
20
3.59k
{
21
3.59k
    auto const bytes = ReadonlyBytes { data, size };
22
3.59k
    auto stream = try_make<FixedMemoryStream>(bytes).release_value();
23
3.59k
    auto audio_or_error = LoaderPluginType::create(move(stream));
24
25
3.59k
    if (audio_or_error.is_error())
26
1.86k
        return 0;
27
28
1.72k
    auto audio = audio_or_error.release_value();
29
30
89.6k
    for (;;) {
31
89.6k
        auto samples = audio->load_chunks(4 * KiB);
32
89.6k
        if (samples.is_error())
33
867
            return 0;
34
88.8k
        if (samples.value().size() == 0)
35
862
            break;
36
88.8k
    }
37
38
862
    return 0;
39
1.72k
}
int fuzz_audio_loader<Audio::QOALoaderPlugin>(unsigned char const*, unsigned long) requires IsBaseOf<Audio::LoaderPlugin, Audio::QOALoaderPlugin>
Line
Count
Source
20
761
{
21
761
    auto const bytes = ReadonlyBytes { data, size };
22
761
    auto stream = try_make<FixedMemoryStream>(bytes).release_value();
23
761
    auto audio_or_error = LoaderPluginType::create(move(stream));
24
25
761
    if (audio_or_error.is_error())
26
286
        return 0;
27
28
475
    auto audio = audio_or_error.release_value();
29
30
5.46k
    for (;;) {
31
5.46k
        auto samples = audio->load_chunks(4 * KiB);
32
5.46k
        if (samples.is_error())
33
443
            return 0;
34
5.01k
        if (samples.value().size() == 0)
35
32
            break;
36
5.01k
    }
37
38
32
    return 0;
39
475
}
int fuzz_audio_loader<Audio::WavLoaderPlugin>(unsigned char const*, unsigned long) requires IsBaseOf<Audio::LoaderPlugin, Audio::WavLoaderPlugin>
Line
Count
Source
20
1.58k
{
21
1.58k
    auto const bytes = ReadonlyBytes { data, size };
22
1.58k
    auto stream = try_make<FixedMemoryStream>(bytes).release_value();
23
1.58k
    auto audio_or_error = LoaderPluginType::create(move(stream));
24
25
1.58k
    if (audio_or_error.is_error())
26
1.32k
        return 0;
27
28
258
    auto audio = audio_or_error.release_value();
29
30
1.21k
    for (;;) {
31
1.21k
        auto samples = audio->load_chunks(4 * KiB);
32
1.21k
        if (samples.is_error())
33
104
            return 0;
34
1.11k
        if (samples.value().size() == 0)
35
154
            break;
36
1.11k
    }
37
38
154
    return 0;
39
258
}
int fuzz_audio_loader<Audio::FlacLoaderPlugin>(unsigned char const*, unsigned long) requires IsBaseOf<Audio::LoaderPlugin, Audio::FlacLoaderPlugin>
Line
Count
Source
20
293
{
21
293
    auto const bytes = ReadonlyBytes { data, size };
22
293
    auto stream = try_make<FixedMemoryStream>(bytes).release_value();
23
293
    auto audio_or_error = LoaderPluginType::create(move(stream));
24
25
293
    if (audio_or_error.is_error())
26
139
        return 0;
27
28
154
    auto audio = audio_or_error.release_value();
29
30
74.8k
    for (;;) {
31
74.8k
        auto samples = audio->load_chunks(4 * KiB);
32
74.8k
        if (samples.is_error())
33
152
            return 0;
34
74.7k
        if (samples.value().size() == 0)
35
2
            break;
36
74.7k
    }
37
38
2
    return 0;
39
154
}
int fuzz_audio_loader<Audio::MP3LoaderPlugin>(unsigned char const*, unsigned long) requires IsBaseOf<Audio::LoaderPlugin, Audio::MP3LoaderPlugin>
Line
Count
Source
20
956
{
21
956
    auto const bytes = ReadonlyBytes { data, size };
22
956
    auto stream = try_make<FixedMemoryStream>(bytes).release_value();
23
956
    auto audio_or_error = LoaderPluginType::create(move(stream));
24
25
956
    if (audio_or_error.is_error())
26
114
        return 0;
27
28
842
    auto audio = audio_or_error.release_value();
29
30
8.09k
    for (;;) {
31
8.09k
        auto samples = audio->load_chunks(4 * KiB);
32
8.09k
        if (samples.is_error())
33
168
            return 0;
34
7.92k
        if (samples.value().size() == 0)
35
674
            break;
36
7.92k
    }
37
38
674
    return 0;
39
842
}