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 #include "fuzzer/FuzzedDataProvider.h"
16 #include "scancallbackproxy_fuzzer.h"
17 #include "scan_callback_proxy.h"
18 
19 namespace OHOS {
20 namespace Scan {
21     constexpr uint8_t MAX_STRING_LENGTH = 255;
22     constexpr int MAX_SET_NUMBER = 100;
23     constexpr size_t FOO_MAX_LEN = 1024;
24     constexpr size_t U32_AT_SIZE = 4;
25 
TestTcpOnCallback(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)26     void TestTcpOnCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
27     {
28         uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
29         ScanDeviceInfoTCP info;
30         sptr<IRemoteObject> impl;
31         ScanCallbackProxy scanCallbackProxy(impl);
32         scanCallbackProxy.OnCallback(state, info);
33     }
34 
TestUsbOnCallback(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)35     void TestUsbOnCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
36     {
37         uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
38         ScanDeviceInfo info;
39         sptr<IRemoteObject> impl;
40         ScanCallbackProxy scanCallbackProxy(impl);
41         scanCallbackProxy.OnCallback(state, info);
42     }
43 
TestOnCallbackSync(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)44     void TestOnCallbackSync(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
45     {
46         uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
47         ScanDeviceInfoSync info;
48         sptr<IRemoteObject> impl;
49         ScanCallbackProxy scanCallbackProxy(impl);
50         scanCallbackProxy.OnCallbackSync(state, info);
51     }
52 
TestOnGetFrameResCallback(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)53     void TestOnGetFrameResCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
54     {
55         bool isGetSucc = dataProvider->ConsumeBool();
56         int32_t sizeRead = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
57         sptr<IRemoteObject> impl;
58         ScanCallbackProxy scanCallbackProxy(impl);
59         scanCallbackProxy.OnGetFrameResCallback(isGetSucc, sizeRead);
60     }
61 
TestOnScanInitCallback(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)62     void TestOnScanInitCallback(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
63     {
64         int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
65         sptr<IRemoteObject> impl;
66         ScanCallbackProxy scanCallbackProxy(impl);
67         scanCallbackProxy.OnScanInitCallback(scanVersion);
68     }
69 
TestOnSendSearchMessage(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)70     void TestOnSendSearchMessage(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
71     {
72         std::string message = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
73         sptr<IRemoteObject> impl;
74         ScanCallbackProxy scanCallbackProxy(impl);
75         scanCallbackProxy.OnSendSearchMessage(message);
76     }
77 
78 }
79 }
80 
81 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)82 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
83 {
84     if (data == nullptr) {
85         return 0;
86     }
87 
88     if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
89         return 0;
90     }
91     FuzzedDataProvider dataProvider(data, size);
92     OHOS::Scan::TestTcpOnCallback(data, size, &dataProvider);
93     OHOS::Scan::TestUsbOnCallback(data, size, &dataProvider);
94     OHOS::Scan::TestOnCallbackSync(data, size, &dataProvider);
95     OHOS::Scan::TestOnGetFrameResCallback(data, size, &dataProvider);
96     OHOS::Scan::TestOnScanInitCallback(data, size, &dataProvider);
97     OHOS::Scan::TestOnSendSearchMessage(data, size, &dataProvider);
98     return 0;
99 }
100 
101