• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "fuzzer/FuzzedDataProvider.h"
17 #include "scanmdnsservice_fuzzer.h"
18 #include "scan_mdns_service.h"
19 
20 namespace OHOS {
21 namespace Scan {
22     constexpr uint8_t MAX_STRING_LENGTH = 255;
23     constexpr int MAX_SET_NUMBER = 100;
24     constexpr size_t FOO_MAX_LEN = 1024;
25     constexpr size_t U32_AT_SIZE = 4;
26 
TestOnStartDiscoverService(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)27     void TestOnStartDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
28     {
29         ScanMdnsService::GetInstance().SetServiceType("_scanner._tcp");
30         ScanMdnsService::GetInstance().onStartDiscoverService();
31     }
32 
TestSetServiceInfo(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)33     void TestSetServiceInfo(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
34     {
35         MDnsServiceInfo info;
36         ScanMdnsService::GetInstance().SetServiceInfo(info);
37     }
38 
TestSetMDnsResolveCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)39     void TestSetMDnsResolveCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
40     {
41         sptr<ScanMDnsResolveObserver> cb;
42         ScanMdnsService::GetInstance().SetMDnsResolveCallBack(cb);
43     }
44 
TestSetMDnsDiscoveryCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)45     void TestSetMDnsDiscoveryCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
46     {
47         sptr<ScanMDnsDiscoveryObserver> cb;
48         ScanMdnsService::GetInstance().SetMDnsDiscoveryCallBack(cb);
49         ScanMdnsService::GetInstance().onStartDiscoverService();
50     }
51 
TestSetServiceType(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)52     void TestSetServiceType(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
53     {
54         std::string stype = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
55         ScanMdnsService::GetInstance().SetServiceType(stype);
56     }
57 
TestGetMDnsResolveCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)58     void TestGetMDnsResolveCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
59     {
60         ScanMdnsService::GetInstance().GetMDnsResolveCallBack();
61     }
62 
TestGetMDnsDiscoveryCallBack(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)63     void TestGetMDnsDiscoveryCallBack(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
64     {
65         ScanMdnsService::GetInstance().GetMDnsDiscoveryCallBack();
66     }
67 
TestGetServiceInfo(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)68     void TestGetServiceInfo(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
69     {
70         ScanMdnsService::GetInstance().GetServiceInfo();
71     }
72 
TestGetServiceAttribute(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)73     void TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
74     {
75         MDnsServiceInfo serviceInfo;
76         std::string keyStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
77         ScanMdnsService::GetInstance().GetServiceAttribute(serviceInfo, keyStr);
78     }
79 
TestonStopDiscoverService(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)80     void TestonStopDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
81     {
82         ScanMdnsService::GetInstance().onStopDiscoverService();
83     }
84 
TestonResolveService(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)85     void TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
86     {
87         MDnsServiceInfo serviceInfo;
88         ScanMdnsService::GetInstance().onResolveService(serviceInfo);
89     }
90 
TestToMDnsScaner(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)91     void TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
92     {
93         MDnsServiceInfo serviceInfo;
94         ScanMdnsService::GetInstance().ToMDnsScaner(serviceInfo);
95     }
96 
TestHandleServiceFound(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)97     void TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
98     {
99         MDnsServiceInfo serviceInfo;
100         ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
101         int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
102         scanMDnsDiscoveryObserver.HandleServiceFound(serviceInfo, retCode);
103     }
104 
TestHandleResolveResult(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)105     void TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
106     {
107         MDnsServiceInfo serviceInfo;
108         ScanMDnsResolveObserver scanMDnsResolveObserver = ScanMDnsResolveObserver(serviceInfo);
109         int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
110         scanMDnsResolveObserver.HandleResolveResult(serviceInfo, retCode);
111     }
112 
TestHandleStopDiscover(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)113     void TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
114     {
115         MDnsServiceInfo serviceInfo;
116         ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo);
117         int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
118         scanMDnsDiscoveryObserver.HandleStopDiscover(serviceInfo, retCode);
119     }
120 
121 }
122 }
123 
124 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)125 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
126 {
127     if (data == nullptr) {
128         return 0;
129     }
130 
131     if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
132         return 0;
133     }
134     FuzzedDataProvider dataProvider(data, size);
135     OHOS::Scan::TestOnStartDiscoverService(data, size, &dataProvider);
136     OHOS::Scan::TestSetServiceInfo(data, size, &dataProvider);
137     OHOS::Scan::TestSetMDnsResolveCallBack(data, size, &dataProvider);
138     OHOS::Scan::TestSetMDnsDiscoveryCallBack(data, size, &dataProvider);
139     OHOS::Scan::TestSetServiceType(data, size, &dataProvider);
140     OHOS::Scan::TestGetMDnsResolveCallBack(data, size, &dataProvider);
141     OHOS::Scan::TestGetMDnsDiscoveryCallBack(data, size, &dataProvider);
142     OHOS::Scan::TestGetServiceInfo(data, size, &dataProvider);
143     OHOS::Scan::TestGetServiceAttribute(data, size, &dataProvider);
144     OHOS::Scan::TestonStopDiscoverService(data, size, &dataProvider);
145     OHOS::Scan::TestonResolveService(data, size, &dataProvider);
146     OHOS::Scan::TestToMDnsScaner(data, size, &dataProvider);
147     OHOS::Scan::TestHandleServiceFound(data, size, &dataProvider);
148     OHOS::Scan::TestHandleResolveResult(data, size, &dataProvider);
149     OHOS::Scan::TestHandleStopDiscover(data, size, &dataProvider);
150     return 0;
151 }
152 
153