Coverage Report

Created: 2024-02-25 06:30

/src/openthread/tests/fuzz/ncp_hdlc_received.cpp
Line
Count
Source
1
/*
2
 *  Copyright (c) 2018, The OpenThread Authors.
3
 *  All rights reserved.
4
 *
5
 *  Redistribution and use in source and binary forms, with or without
6
 *  modification, are permitted provided that the following conditions are met:
7
 *  1. Redistributions of source code must retain the above copyright
8
 *     notice, this list of conditions and the following disclaimer.
9
 *  2. Redistributions in binary form must reproduce the above copyright
10
 *     notice, this list of conditions and the following disclaimer in the
11
 *     documentation and/or other materials provided with the distribution.
12
 *  3. Neither the name of the copyright holder nor the
13
 *     names of its contributors may be used to endorse or promote products
14
 *     derived from this software without specific prior written permission.
15
 *
16
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
 *  POSSIBILITY OF SUCH DAMAGE.
27
 */
28
29
#include <stdlib.h>
30
#include <string.h>
31
32
#include <openthread/instance.h>
33
#include <openthread/ip6.h>
34
#include <openthread/link.h>
35
#include <openthread/ncp.h>
36
#include <openthread/srp_server.h>
37
#include <openthread/tasklet.h>
38
#include <openthread/thread.h>
39
#include <openthread/thread_ftd.h>
40
#include <openthread/platform/alarm-milli.h>
41
42
#include "fuzzer_platform.h"
43
#include "common/code_utils.hpp"
44
#include "common/time.hpp"
45
46
static int HdlcSend(const uint8_t *aBuf, uint16_t aBufLength)
47
19.4k
{
48
19.4k
    OT_UNUSED_VARIABLE(aBuf);
49
19.4k
    OT_UNUSED_VARIABLE(aBufLength);
50
51
19.4k
    return aBufLength;
52
19.4k
}
53
54
void AdvanceTime(otInstance *aInstance, uint32_t aDuration)
55
39.9k
{
56
39.9k
    uint32_t time = otPlatAlarmMilliGetNow() + aDuration;
57
58
2.03M
    while (ot::TimeMilli(otPlatAlarmMilliGetNow()) <= ot::TimeMilli(time))
59
1.99M
    {
60
3.86M
        while (otTaskletsArePending(aInstance))
61
1.87M
        {
62
1.87M
            otTaskletsProcess(aInstance);
63
1.87M
        }
64
65
1.99M
        FuzzerPlatformProcess(aInstance);
66
1.99M
    }
67
39.9k
}
68
69
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
70
32.3k
{
71
32.3k
    const otPanId panId = 0xdead;
72
73
32.3k
    otInstance *instance = nullptr;
74
32.3k
    uint8_t    *buf      = nullptr;
75
76
32.3k
    VerifyOrExit(size <= 65536);
77
78
32.2k
    FuzzerPlatformInit();
79
80
32.2k
    instance = otInstanceInitSingle();
81
32.2k
    otNcpHdlcInit(instance, HdlcSend);
82
32.2k
    IgnoreError(otLinkSetPanId(instance, panId));
83
32.2k
    IgnoreError(otIp6SetEnabled(instance, true));
84
32.2k
    IgnoreError(otThreadSetEnabled(instance, true));
85
32.2k
    otSrpServerSetEnabled(instance, true);
86
32.2k
    IgnoreError(otThreadBecomeLeader(instance));
87
88
32.2k
    AdvanceTime(instance, 10000);
89
90
32.2k
    buf = static_cast<uint8_t *>(malloc(size));
91
32.2k
    memcpy(buf, data, size);
92
32.2k
    otNcpHdlcReceive(buf, static_cast<uint16_t>(size));
93
94
32.2k
    VerifyOrExit(!FuzzerPlatformResetWasRequested());
95
96
4.78k
    AdvanceTime(instance, 10000);
97
98
32.3k
exit:
99
100
32.3k
    if (buf != nullptr)
101
32.2k
    {
102
32.2k
        free(buf);
103
32.2k
    }
104
105
32.3k
    if (instance != nullptr)
106
32.2k
    {
107
32.2k
        otInstanceFinalize(instance);
108
32.2k
    }
109
110
32.3k
    return 0;
111
4.78k
}