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 #define TDD_ENABLE 1
17 
18 #include "fuzzer/FuzzedDataProvider.h"
19 #include "napi/native_api.h"
20 #include "scan_callback.h"
21 #include "scancallbackstub_fuzzer.h"
22 
23 namespace OHOS::Scan {
24 constexpr uint8_t MAX_STRING_LENGTH = 255;
25 constexpr int MAX_SET_NUMBER = 100;
26 constexpr size_t FOO_MAX_LEN = 1024;
27 constexpr size_t U32_AT_SIZE = 4;
28 
OnRemoteRequestFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)29 void OnRemoteRequestFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
30 {
31     uint32_t code = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
32     MessageParcel parcelData;
33     parcelData.WriteInterfaceToken(u"OHOS.Scan.IScanCallback");
34     MessageParcel reply;
35     ScanCallback callBack(nullptr, nullptr);
36     MessageOption option;
37     callBack.OnRemoteRequest(code, parcelData, reply, option);
38 }
39 
HandleDeviceInfoTcpEventFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)40 void HandleDeviceInfoTcpEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
41 {
42     MessageParcel parcelData;
43     uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
44     parcelData.WriteUint32(state);
45     ScanCallback callBack(nullptr, nullptr);
46     MessageParcel reply;
47     callBack.HandleDeviceInfoTcpEvent(parcelData, reply);
48 }
49 
HandleDeviceInfoEventFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)50 void HandleDeviceInfoEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
51 {
52     MessageParcel parcelData;
53     uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
54     parcelData.WriteUint32(state);
55     ScanCallback callBack(nullptr, nullptr);
56     MessageParcel reply;
57     callBack.HandleDeviceInfoEvent(parcelData, reply);
58 }
59 
HandleDeviceInfoSyncEventFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)60 void HandleDeviceInfoSyncEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
61 {
62     MessageParcel parcelData;
63     uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
64     parcelData.WriteUint32(state);
65     ScanCallback callBack(nullptr, nullptr);
66     MessageParcel reply;
67     callBack.HandleDeviceInfoSyncEvent(parcelData, reply);
68 }
69 
HandleGetFrameResEventFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)70 void HandleGetFrameResEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
71 {
72     MessageParcel parcelData;
73     bool isGetSucc = dataProvider->ConsumeBool();
74     parcelData.WriteBool(isGetSucc);
75     int32_t sizeRead = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
76     parcelData.WriteInt32(sizeRead);
77     ScanCallback callBack(nullptr, nullptr);
78     MessageParcel reply;
79     callBack.HandleGetFrameResEvent(parcelData, reply);
80 }
81 
HandleScanInitEventFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)82 void HandleScanInitEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
83 {
84     MessageParcel parcelData;
85     int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
86     parcelData.WriteInt32(scanVersion);
87     ScanCallback callBack(nullptr, nullptr);
88     MessageParcel reply;
89     callBack.HandleScanInitEvent(parcelData, reply);
90 }
91 
HandleSendSearchMessageFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)92 void HandleSendSearchMessageFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
93 {
94     MessageParcel parcelData;
95     std::string message = parcelData.ReadString();
96     parcelData.WriteString(message);
97     message = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
98     parcelData.WriteString(message);
99     ScanCallback callBack(nullptr, nullptr);
100     MessageParcel reply;
101     callBack.HandleSendSearchMessage(parcelData, reply);
102 }
103 
HandleSendDeviceListFuzzTest(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)104 void HandleSendDeviceListFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
105 {
106     MessageParcel parcelData;
107     int32_t infosSize = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
108     parcelData.WriteInt32(infosSize);
109     std::vector<ScanDeviceInfo> infos(infosSize);
110     for (size_t i = 0; i < infos.size(); i++) {
111         infos[i].Marshalling(parcelData);
112     }
113     ScanCallback callBack(nullptr, nullptr);
114     MessageParcel reply;
115     callBack.HandleSendDeviceList(parcelData, reply);
116 }
117 
118 }
119 
120 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)121 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
122 {
123     if (data == nullptr) {
124         return 0;
125     }
126 
127     if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
128         return 0;
129     }
130     FuzzedDataProvider dataProvider(data, size);
131     OHOS::Scan::OnRemoteRequestFuzzTest(data, size, &dataProvider);
132     OHOS::Scan::HandleDeviceInfoTcpEventFuzzTest(data, size, &dataProvider);
133     OHOS::Scan::HandleDeviceInfoEventFuzzTest(data, size, &dataProvider);
134     OHOS::Scan::HandleDeviceInfoSyncEventFuzzTest(data, size, &dataProvider);
135     OHOS::Scan::HandleGetFrameResEventFuzzTest(data, size, &dataProvider);
136     OHOS::Scan::HandleScanInitEventFuzzTest(data, size, &dataProvider);
137     OHOS::Scan::HandleSendSearchMessageFuzzTest(data, size, &dataProvider);
138     OHOS::Scan::HandleSendDeviceListFuzzTest(data, size, &dataProvider);
139     return 0;
140 }
141 
142