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 20namespace OHOS { 21namespace 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 27 void TestOnStartDiscoverService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 28 { 29 std::string serviceName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 30 ScanMdnsService::GetInstance().SetServiceType(serviceName.c_str()); 31 ScanMdnsService::GetInstance().onStartDiscoverService(); 32 ScanMdnsService::GetInstance().onStopDiscoverService(); 33 } 34 35 void TestSetService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 36 { 37 MDnsServiceInfo info; 38 ScanMdnsService::GetInstance().SetServiceInfo(info); 39 sptr<ScanMDnsResolveObserver> resolveObserve; 40 ScanMdnsService::GetInstance().SetMDnsResolveCallBack(resolveObserve); 41 sptr<ScanMDnsDiscoveryObserver> discoveryObserve; 42 ScanMdnsService::GetInstance().SetMDnsDiscoveryCallBack(discoveryObserve); 43 ScanMdnsService::GetInstance().onStartDiscoverService(); 44 std::string stype = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 45 ScanMdnsService::GetInstance().SetServiceType(stype); 46 ScanMdnsService::GetInstance().GetMDnsResolveCallBack(); 47 ScanMdnsService::GetInstance().GetMDnsDiscoveryCallBack(); 48 ScanMdnsService::GetInstance().GetServiceInfo(); 49 } 50 51 void TestGetServiceAttribute(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 52 { 53 MDnsServiceInfo serviceInfo; 54 serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 55 std::string keyStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 56 ScanMdnsService::GetInstance().GetServiceAttribute(serviceInfo, keyStr); 57 } 58 59 void TestonResolveService(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 60 { 61 MDnsServiceInfo serviceInfo; 62 serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 63 ScanMdnsService::GetInstance().onResolveService(serviceInfo); 64 } 65 66 void TestToMDnsScaner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 67 { 68 MDnsServiceInfo serviceInfo; 69 serviceInfo.name = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH); 70 ScanMdnsService::GetInstance().ToMDnsScaner(serviceInfo); 71 } 72 73 void TestHandleServiceFound(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 74 { 75 MDnsServiceInfo serviceInfo; 76 ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo); 77 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 78 scanMDnsDiscoveryObserver.HandleServiceFound(serviceInfo, retCode); 79 } 80 81 void TestHandleResolveResult(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 82 { 83 MDnsServiceInfo serviceInfo; 84 ScanMDnsResolveObserver scanMDnsResolveObserver = ScanMDnsResolveObserver(serviceInfo); 85 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 86 scanMDnsResolveObserver.HandleResolveResult(serviceInfo, retCode); 87 } 88 89 void TestHandleStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider) 90 { 91 MDnsServiceInfo serviceInfo; 92 ScanMDnsDiscoveryObserver scanMDnsDiscoveryObserver = ScanMDnsDiscoveryObserver(serviceInfo); 93 int32_t retCode = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER); 94 scanMDnsDiscoveryObserver.HandleStopDiscover(serviceInfo, retCode); 95 } 96 97} 98} 99 100/* Fuzzer entry point */ 101extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 102{ 103 if (data == nullptr) { 104 return 0; 105 } 106 107 if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) { 108 return 0; 109 } 110 FuzzedDataProvider dataProvider(data, size); 111 OHOS::Scan::TestOnStartDiscoverService(data, size, &dataProvider); 112 OHOS::Scan::TestGetServiceAttribute(data, size, &dataProvider); 113 OHOS::Scan::TestonResolveService(data, size, &dataProvider); 114 OHOS::Scan::TestToMDnsScaner(data, size, &dataProvider); 115 OHOS::Scan::TestHandleServiceFound(data, size, &dataProvider); 116 OHOS::Scan::TestHandleResolveResult(data, size, &dataProvider); 117 OHOS::Scan::TestHandleStopDiscover(data, size, &dataProvider); 118 return 0; 119} 120 121