• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "discoveryservice_fuzzer.h"
17 
18 #include <cstddef>
19 #include <string>
20 #include "discovery_service.h"
21 
22 namespace OHOS {
23 static std::string TEST_PACKAGE_NAME = "TestPackageName";
24 
TestPublishSuccess(int publicId)25 static void TestPublishSuccess(int publicId) {}
TestPublishFail(int publishId,PublishFailReason reason)26 static void TestPublishFail(int publishId, PublishFailReason reason) {}
27 static IPublishCallback g_publishCallback = {
28     .OnPublishSuccess = TestPublishSuccess,
29     .OnPublishFail = TestPublishFail,
30 };
31 
TestDeviceFound(const DeviceInfo * device)32 static void TestDeviceFound(const DeviceInfo *device) {}
TestDiscoverFailed(int subscribeId,DiscoveryFailReason failReason)33 static void TestDiscoverFailed(int subscribeId, DiscoveryFailReason failReason) {}
TestDiscoverySuccess(int subscribeId)34 static void TestDiscoverySuccess(int subscribeId) {}
35 static IDiscoveryCallback g_discoveryCallback = {
36     .OnDeviceFound = TestDeviceFound,
37     .OnDiscoverFailed = TestDiscoverFailed,
38     .OnDiscoverySuccess = TestDiscoverySuccess,
39 };
40 
41 static PublishInfo g_publishInfo;
GenerateMode(uint8_t data)42 static DiscoverMode GenerateMode(uint8_t data)
43 {
44     if (data < UINT8_MAX / 2) {
45         return DISCOVER_MODE_ACTIVE;
46     }
47     return DISCOVER_MODE_PASSIVE;
48 }
49 
GenerateMedium(uint8_t data)50 static ExchangeMedium GenerateMedium(uint8_t data)
51 {
52     if (data < UINT8_MAX / MEDIUM_BUTT) {
53         return AUTO;
54     }
55     if (data < UINT8_MAX / MEDIUM_BUTT * 2) {
56         return BLE;
57     }
58     if (data < UINT8_MAX / MEDIUM_BUTT * 3) {
59         return COAP;
60     }
61     if (data < UINT8_MAX / MEDIUM_BUTT * 4) {
62         return USB;
63     }
64     return COAP1;
65 }
66 
GenerateFreq(uint8_t data)67 static ExchangeFreq GenerateFreq(uint8_t data)
68 {
69     if (data < UINT8_MAX / FREQ_BUTT) {
70         return LOW;
71     }
72     if (data < UINT8_MAX / FREQ_BUTT * 2) {
73         return MID;
74     }
75     if (data < UINT8_MAX / FREQ_BUTT * 3) {
76         return HIGH;
77     }
78     return SUPER_HIGH;
79 }
80 
GeneratePublishInfo(const uint8_t * data,size_t size)81 static PublishInfo *GeneratePublishInfo(const uint8_t *data, size_t size)
82 {
83     if (size < sizeof(PublishInfo)) {
84         return &g_publishInfo;
85     }
86 
87     g_publishInfo.publishId = *data++;
88     g_publishInfo.mode = GenerateMode(*data++);
89     g_publishInfo.medium = GenerateMedium(*data++);
90     g_publishInfo.freq = GenerateFreq(*data);
91 
92     return &g_publishInfo;
93 }
94 
95 static SubscribeInfo g_subscribeInfo;
GenerateSubscribeInfo(const uint8_t * data,size_t size)96 static SubscribeInfo *GenerateSubscribeInfo(const uint8_t *data, size_t size)
97 {
98     if (size < sizeof(SubscribeInfo)) {
99         return &g_subscribeInfo;
100     }
101 
102     g_subscribeInfo.subscribeId = *data++;
103     g_subscribeInfo.mode = GenerateMode(*data++);
104     g_subscribeInfo.medium = GenerateMedium(*data++);
105     g_subscribeInfo.freq = GenerateFreq(*data++);
106     g_subscribeInfo.isSameAccount = *data++;
107     g_subscribeInfo.isWakeRemote = *data;
108 
109     return &g_subscribeInfo;
110 }
111 
DiscoveryServiceTest(const uint8_t * data,size_t size)112 void DiscoveryServiceTest(const uint8_t* data, size_t size)
113 {
114     PublishService(TEST_PACKAGE_NAME.c_str(), GeneratePublishInfo(data, size), &g_publishCallback);
115     UnPublishService(TEST_PACKAGE_NAME.c_str(), *data);
116     StartDiscovery(TEST_PACKAGE_NAME.c_str(), GenerateSubscribeInfo(data, size), &g_discoveryCallback);
117     StopDiscovery(TEST_PACKAGE_NAME.c_str(), *data);
118 }
119 } // namespace OHOS
120 
121 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)122 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
123 {
124     if (data == nullptr || size < sizeof(int32_t)) {
125         return 0;
126     }
127     OHOS::DiscoveryServiceTest(data, size);
128     return 0;
129 }