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