/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 | } |