blob: d30b4aef70fe0a5b7e134563e9bbf2c6612aeace [file] [log] [blame]
Jonathan Hui791dd242017-07-20 10:38:29 -07001/*
2 * Copyright (c) 2017, 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
Jonathan Huib7b085c2019-04-11 11:59:20 -070029#define MAX_ITERATIONS 100
30
Jonathan Hui791dd242017-07-20 10:38:29 -070031#include <stdlib.h>
32#include <string.h>
33
Jonathan Hui713c7092017-08-02 12:29:59 -070034#include <openthread/instance.h>
35#include <openthread/ip6.h>
36#include <openthread/link.h>
Jonathan Hui3eb5a102019-02-22 09:00:23 -080037#include <openthread/tasklet.h>
Jonathan Hui713c7092017-08-02 12:29:59 -070038#include <openthread/thread.h>
Jonathan Hui71d40a52017-08-04 16:06:59 -070039#include <openthread/thread_ftd.h>
Jonathan Hui791dd242017-07-20 10:38:29 -070040#include <openthread/platform/radio.h>
41
Jonathan Hui0dde90e2019-08-13 08:49:51 -070042#include "fuzzer_platform.h"
Jonathan Hui791dd242017-07-20 10:38:29 -070043#include "common/code_utils.hpp"
44
Jonathan Hui5c523732017-08-23 14:45:26 -070045extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Jonathan Hui791dd242017-07-20 10:38:29 -070046{
Jonathan Hui71d40a52017-08-04 16:06:59 -070047 const otPanId panId = 0xdead;
Jonathan Hui791dd242017-07-20 10:38:29 -070048
Jonathan Hui1326d642020-06-17 22:44:54 -070049 otInstance * instance = nullptr;
Jonathan Hui5c523732017-08-23 14:45:26 -070050 otRadioFrame frame;
Jonathan Hui1326d642020-06-17 22:44:54 -070051 uint8_t * buf = nullptr;
Jonathan Hui5c523732017-08-23 14:45:26 -070052
Abtin Keshavarzianc9c0cf42020-10-13 23:26:02 -070053 VerifyOrExit(size <= OT_RADIO_FRAME_MAX_SIZE);
Jonathan Hui5c523732017-08-23 14:45:26 -070054
55 FuzzerPlatformInit();
56
Jonathan Hui66a98482017-08-30 22:01:16 -070057 instance = otInstanceInitSingle();
kangping49f36f82020-05-07 02:17:58 +080058 IgnoreError(otLinkSetPanId(instance, panId));
59 IgnoreError(otIp6SetEnabled(instance, true));
60 IgnoreError(otThreadSetEnabled(instance, true));
61 IgnoreError(otThreadBecomeLeader(instance));
Jonathan Hui71d40a52017-08-04 16:06:59 -070062
Jonathan Hui791dd242017-07-20 10:38:29 -070063 buf = static_cast<uint8_t *>(malloc(size));
64
65 memset(&frame, 0, sizeof(frame));
Jonathan Hui69d98d42018-02-06 14:14:57 -080066 frame.mPsdu = buf;
Jonathan Hui791dd242017-07-20 10:38:29 -070067 frame.mChannel = 11;
Jonathan Hui69d98d42018-02-06 14:14:57 -080068 frame.mLength = static_cast<uint8_t>(size);
Jonathan Hui791dd242017-07-20 10:38:29 -070069
70 memcpy(buf, data, frame.mLength);
71
Jonathan Hui66a98482017-08-30 22:01:16 -070072 otPlatRadioReceiveDone(instance, &frame, OT_ERROR_NONE);
Jonathan Hui791dd242017-07-20 10:38:29 -070073
Abtin Keshavarzianc9c0cf42020-10-13 23:26:02 -070074 VerifyOrExit(!FuzzerPlatformResetWasRequested());
Jonathan Hui0dde90e2019-08-13 08:49:51 -070075
Jonathan Huib7b085c2019-04-11 11:59:20 -070076 for (int i = 0; i < MAX_ITERATIONS; i++)
Jonathan Hui3eb5a102019-02-22 09:00:23 -080077 {
Jonathan Huib7b085c2019-04-11 11:59:20 -070078 while (otTaskletsArePending(instance))
79 {
80 otTaskletsProcess(instance);
81 }
82
83 FuzzerPlatformProcess(instance);
Jonathan Hui3eb5a102019-02-22 09:00:23 -080084 }
85
Jonathan Hui791dd242017-07-20 10:38:29 -070086exit:
Jonathan Hui66a98482017-08-30 22:01:16 -070087
Jonathan Hui1326d642020-06-17 22:44:54 -070088 if (buf != nullptr)
Jonathan Hui66a98482017-08-30 22:01:16 -070089 {
90 free(buf);
91 }
92
Jonathan Hui1326d642020-06-17 22:44:54 -070093 if (instance != nullptr)
Jonathan Hui66a98482017-08-30 22:01:16 -070094 {
95 otInstanceFinalize(instance);
96 }
97
Jonathan Hui791dd242017-07-20 10:38:29 -070098 return 0;
99}