1 /*
2 * Copyright (c) 2023-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 "softbusclientstub_fuzzer.h"
17
18 #include <cstdint>
19 #include <cstring>
20 #include <fuzzer/FuzzedDataProvider.h>
21 #include <securec.h>
22
23 #include "client_trans_channel_manager.h"
24 #include "fuzz_data_generator.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_client_stub.h"
27 #include "softbus_server_ipc_interface_code.h"
28
29 namespace OHOS {
30 constexpr size_t FOO_MAX_LEN = 1024;
31 constexpr size_t U32_AT_SIZE = 4;
32 constexpr size_t UUID_STRING_LEN = 38;
33 constexpr size_t HAP_NAME_MAX_LEN = 256;
34
35 class TestEnv {
36 public:
TestEnv()37 TestEnv()
38 {
39 isInited_ = false;
40 ClientTransChannelInit();
41 isInited_ = true;
42 }
43
~TestEnv()44 ~TestEnv()
45 {
46 isInited_ = false;
47 ClientTransChannelDeinit();
48 }
49
IsInited(void)50 bool IsInited(void)
51 {
52 return isInited_;
53 }
54
55 private:
56 volatile bool isInited_;
57 };
58
59 enum SoftBusFuncId {
60 CLIENT_ON_CHANNEL_OPENED = 256,
61 CLIENT_ON_CHANNEL_OPENFAILED,
62 CLIENT_ON_CHANNEL_LINKDOWN,
63 CLIENT_ON_CHANNEL_CLOSED,
64 CLIENT_ON_CHANNEL_MSGRECEIVED,
65 CLIENT_ON_CHANNEL_QOSEVENT,
66
67 CLIENT_DISCOVERY_DEVICE_FOUND,
68
69 CLIENT_ON_JOIN_RESULT,
70 CLIENT_ON_JOIN_METANODE_RESULT,
71 CLIENT_ON_LEAVE_RESULT,
72 CLIENT_ON_LEAVE_METANODE_RESULT,
73 CLIENT_ON_NODE_DEVICE_TRUST_CHANGED,
74 CLIENT_ON_HICHAIN_PROOF_EXCEPTION,
75 CLIENT_ON_NODE_ONLINE_STATE_CHANGED,
76 CLIENT_ON_NODE_BASIC_INFO_CHANGED,
77 CLIENT_ON_LOCAL_NETWORK_ID_CHANGED,
78 CLIENT_ON_TIME_SYNC_RESULT,
79 CLIENT_ON_PUBLISH_LNN_RESULT,
80 CLIENT_ON_REFRESH_LNN_RESULT,
81 CLIENT_ON_REFRESH_DEVICE_FOUND,
82 CLIENT_ON_PERMISSION_CHANGE,
83 CLIENT_SET_CHANNEL_INFO,
84 CLIENT_ON_DATA_LEVEL_CHANGED,
85 CLIENT_ON_TRANS_LIMIT_CHANGE,
86 CLIENT_ON_CHANNEL_BIND,
87 CLIENT_CHECK_COLLAB_RELATION,
88 };
89
90 const std::u16string SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN = u"OHOS.ISoftBusClient";
91
InitOnChannelOpenedInnerMsg(int32_t channelType,const uint8_t * data,size_t size,MessageParcel & message)92 static void InitOnChannelOpenedInnerMsg(int32_t channelType, const uint8_t *data, size_t size, MessageParcel &message)
93 {
94 bool boolParam = (size % 2 == 0) ? true : false;
95 int32_t int32Param = *(reinterpret_cast<const int32_t *>(data));
96 char *charParam = const_cast<char *>(reinterpret_cast<const char *>(data));
97
98 message.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
99
100 message.WriteCString(charParam);
101 message.WriteInt32(int32Param);
102 message.WriteInt32(channelType);
103 message.WriteUint64(size);
104 message.WriteInt32(int32Param);
105
106 message.WriteBool(boolParam);
107 message.WriteBool(boolParam);
108 message.WriteBool(boolParam);
109 message.WriteInt32(int32Param);
110 message.WriteInt32(int32Param);
111 message.WriteCString(charParam);
112 message.WriteUint32(size);
113 message.WriteRawData(data, size);
114 message.WriteCString(charParam);
115 message.WriteCString(charParam);
116 message.WriteInt32(int32Param);
117
118 if (channelType == CHANNEL_TYPE_UDP) {
119 message.WriteCString(charParam);
120 message.WriteInt32(int32Param);
121 message.WriteBool(boolParam);
122 if (boolParam) {
123 message.WriteInt32(int32Param);
124 message.WriteCString(charParam);
125 }
126 }
127
128 message.WriteInt32(int32Param);
129 message.WriteInt32(int32Param);
130 message.WriteInt32(int32Param);
131 message.WriteInt32(int32Param);
132 message.WriteUint32(size);
133 message.WriteInt32(int32Param);
134 message.WriteInt32(int32Param);
135 }
136
TestDataSwitch(const uint8_t * data,size_t size)137 uint8_t *TestDataSwitch(const uint8_t *data, size_t size)
138 {
139 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
140 return nullptr;
141 }
142 uint8_t *dataWithEndCharacter = static_cast<uint8_t *>(SoftBusCalloc(size + 1));
143 if (dataWithEndCharacter == nullptr) {
144 return nullptr;
145 }
146 if (memcpy_s(dataWithEndCharacter, size, data, size) != EOK) {
147 SoftBusFree(dataWithEndCharacter);
148 return nullptr;
149 }
150 return dataWithEndCharacter;
151 }
152
153 /*
154 * Due to FileDescriptor is invalid, CHANNEL_TYPE_TCP_DIRECT will read it and crash
155 * Do not add test case which channel type is CHANNEL_TYPE_TCP_DIRECT
156 */
OnChannelOpenedInnerTest(const uint8_t * data,size_t size)157 bool OnChannelOpenedInnerTest(const uint8_t *data, size_t size)
158 {
159 uint8_t *dataWithEndCharacter = TestDataSwitch(data, size);
160 if (dataWithEndCharacter == nullptr) {
161 return false;
162 }
163 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
164 if (softBusClientStub == nullptr) {
165 return false;
166 }
167
168 MessageParcel reply;
169 MessageOption option;
170 MessageParcel dataNomal;
171 InitOnChannelOpenedInnerMsg(CHANNEL_TYPE_UNDEFINED, dataWithEndCharacter, size, dataNomal);
172
173 MessageParcel dataUdp;
174 InitOnChannelOpenedInnerMsg(CHANNEL_TYPE_UDP, dataWithEndCharacter, size, dataUdp);
175 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_OPENED, dataUdp, reply, option);
176 SoftBusFree(dataWithEndCharacter);
177 return true;
178 }
179
OnChannelOpenFailedInnerTest(const uint8_t * data,size_t size)180 bool OnChannelOpenFailedInnerTest(const uint8_t *data, size_t size)
181 {
182 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
183 if (softBusClientStub == nullptr || data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
184 return false;
185 }
186 DataGenerator::Write(data, size);
187
188 int32_t channelId = 0;
189 int32_t channelType = 0;
190 int32_t errCode = 0;
191 GenerateInt32(channelId);
192 GenerateInt32(channelType);
193 GenerateInt32(errCode);
194
195 MessageParcel datas;
196 MessageParcel reply;
197 MessageOption option;
198 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
199 datas.WriteInt32(channelId);
200 datas.WriteInt32(channelType);
201 datas.WriteInt32(errCode);
202 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_OPENFAILED, datas, reply, option);
203 DataGenerator::Clear();
204
205 return true;
206 }
207
OnChannelLinkDownInnerTest(const uint8_t * data,size_t size)208 bool OnChannelLinkDownInnerTest(const uint8_t *data, size_t size)
209 {
210 uint8_t *dataWithEndCharacter = TestDataSwitch(data, size);
211 if (dataWithEndCharacter == nullptr) {
212 return false;
213 }
214 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
215 if (softBusClientStub == nullptr) {
216 return false;
217 }
218
219 char *networkId = const_cast<char *>(reinterpret_cast<const char *>(dataWithEndCharacter));
220 int32_t routeType = *(reinterpret_cast<const int32_t *>(dataWithEndCharacter));
221
222 MessageParcel datas;
223 MessageParcel reply;
224 MessageOption option;
225
226 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
227 datas.WriteCString(networkId);
228 datas.WriteInt32(routeType);
229 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_LINKDOWN, datas, reply, option);
230 SoftBusFree(dataWithEndCharacter);
231
232 return true;
233 }
234
OnChannelClosedInnerTest(const uint8_t * data,size_t size)235 bool OnChannelClosedInnerTest(const uint8_t *data, size_t size)
236 {
237 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
238 if (softBusClientStub == nullptr || data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
239 return false;
240 }
241 DataGenerator::Write(data, size);
242
243 int32_t channelId = 0;
244 int32_t channelType = 0;
245 int32_t messageType = 0;
246 GenerateInt32(channelId);
247 GenerateInt32(channelType);
248 GenerateInt32(messageType);
249
250 MessageParcel datas;
251 MessageParcel reply;
252 MessageOption option;
253 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
254 datas.WriteInt32(channelId);
255 datas.WriteInt32(channelType);
256 datas.WriteInt32(messageType);
257 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_CLOSED, datas, reply, option);
258 DataGenerator::Clear();
259
260 return true;
261 }
262
OnChannelMsgReceivedInnerTest(const uint8_t * data,size_t size)263 bool OnChannelMsgReceivedInnerTest(const uint8_t *data, size_t size)
264 {
265 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
266 if (softBusClientStub == nullptr || data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
267 return false;
268 }
269 DataGenerator::Write(data, size);
270
271 int32_t channelId = 0;
272 int32_t channelType = 0;
273 int32_t type = 0;
274 GenerateInt32(channelId);
275 GenerateInt32(channelType);
276 GenerateInt32(type);
277
278 MessageParcel datas;
279 MessageParcel reply;
280 MessageOption option;
281 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
282 datas.WriteInt32(channelId);
283 datas.WriteInt32(channelType);
284 datas.WriteUint32(size);
285 datas.WriteRawData(data, size);
286 datas.WriteInt32(type);
287 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_MSGRECEIVED, datas, reply, option);
288 DataGenerator::Clear();
289
290 return true;
291 }
292
OnChannelQosEventInnerTest(const uint8_t * data,size_t size)293 bool OnChannelQosEventInnerTest(const uint8_t *data, size_t size)
294 {
295 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
296 if (softBusClientStub == nullptr || data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
297 return false;
298 }
299 DataGenerator::Write(data, size);
300
301 int32_t channelId = 0;
302 int32_t channelType = 0;
303 int32_t eventId = 0;
304 GenerateInt32(channelId);
305 GenerateInt32(channelType);
306 GenerateInt32(eventId);
307 WifiChannelQuality wifiChannelInfo = { 0 };
308 GenerateInt32(wifiChannelInfo.channel);
309 GenerateInt32(wifiChannelInfo.score);
310 QosTv qosTv = {
311 .type = WIFI_CHANNEL_QUALITY,
312 .info.wifiChannelInfo = wifiChannelInfo,
313 };
314
315 MessageParcel datas;
316 MessageParcel reply;
317 MessageOption option;
318 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
319 datas.WriteInt32(channelId);
320 datas.WriteInt32(channelType);
321 datas.WriteInt32(eventId);
322 datas.WriteInt32(sizeof(qosTv));
323 datas.WriteRawData(&qosTv, sizeof(qosTv));
324 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_QOSEVENT, datas, reply, option);
325 DataGenerator::Clear();
326
327 return true;
328 }
329
OnDeviceFoundInnerTest(const uint8_t * data,size_t size)330 bool OnDeviceFoundInnerTest(const uint8_t *data, size_t size)
331 {
332 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
333 return false;
334 }
335 MessageParcel datas;
336 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
337 datas.WriteBuffer(data, size);
338 datas.RewindRead(0);
339 MessageParcel reply;
340 MessageOption option;
341 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
342 if (softBusClientStub == nullptr) {
343 return false;
344 }
345 softBusClientStub->OnRemoteRequest(CLIENT_DISCOVERY_DEVICE_FOUND, datas, reply, option);
346 return true;
347 }
348
OnJoinLNNResultInnerTest(const uint8_t * data,size_t size)349 bool OnJoinLNNResultInnerTest(const uint8_t *data, size_t size)
350 {
351 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
352 return false;
353 }
354 constexpr uint32_t addrTypeLen = 10;
355 constexpr int32_t retCode = 2;
356 const char *test = "test";
357 constexpr size_t len = 4;
358 MessageParcel datas;
359 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
360 datas.WriteUint32(addrTypeLen);
361 datas.WriteInt32(retCode);
362 datas.WriteRawData(test, len);
363 datas.WriteBuffer(data, size);
364 datas.RewindRead(0);
365 MessageParcel reply;
366 MessageOption option;
367 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
368 if (softBusClientStub == nullptr) {
369 return false;
370 }
371 softBusClientStub->OnRemoteRequest(CLIENT_ON_JOIN_RESULT, datas, reply, option);
372 return true;
373 }
374
OnJoinMetaNodeResultInnerTest(const uint8_t * data,size_t size)375 bool OnJoinMetaNodeResultInnerTest(const uint8_t *data, size_t size)
376 {
377 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
378 return false;
379 }
380 constexpr uint32_t addrTypeLen = 12;
381 constexpr int32_t retCode = 2;
382 const char *test = "test";
383 constexpr size_t len = 4;
384 MessageParcel datas;
385 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
386 datas.WriteUint32(addrTypeLen);
387 datas.WriteInt32(retCode);
388 datas.WriteRawData(test, len);
389 datas.WriteBuffer(data, size);
390 datas.RewindRead(0);
391 MessageParcel reply;
392 MessageOption option;
393 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
394 if (softBusClientStub == nullptr) {
395 return false;
396 }
397 softBusClientStub->OnRemoteRequest(CLIENT_ON_JOIN_METANODE_RESULT, datas, reply, option);
398 return true;
399 }
400
OnLeaveLNNResultInnerTest(const uint8_t * data,size_t size)401 bool OnLeaveLNNResultInnerTest(const uint8_t *data, size_t size)
402 {
403 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
404 return false;
405 }
406 constexpr int32_t intNum = 2;
407 MessageParcel datas;
408 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
409 datas.WriteBuffer(data, size);
410 datas.WriteInt32(intNum);
411 datas.RewindRead(0);
412 MessageParcel reply;
413 MessageOption option;
414 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
415 if (softBusClientStub == nullptr) {
416 return false;
417 }
418 softBusClientStub->OnRemoteRequest(CLIENT_ON_LEAVE_RESULT, datas, reply, option);
419 return true;
420 }
421
OnLeaveMetaNodeResultInnerTest(const uint8_t * data,size_t size)422 bool OnLeaveMetaNodeResultInnerTest(const uint8_t *data, size_t size)
423 {
424 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
425 return false;
426 }
427 constexpr int32_t intNum = 2;
428 MessageParcel datas;
429 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
430 datas.WriteBuffer(data, size);
431 datas.WriteInt32(intNum);
432 datas.RewindRead(0);
433 MessageParcel reply;
434 MessageOption option;
435 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
436 if (softBusClientStub == nullptr) {
437 return false;
438 }
439 softBusClientStub->OnRemoteRequest(CLIENT_ON_LEAVE_METANODE_RESULT, datas, reply, option);
440 return true;
441 }
442
OnNodeDeviceTrustedChangeInnerTest(const uint8_t * data,size_t size)443 bool OnNodeDeviceTrustedChangeInnerTest(const uint8_t *data, size_t size)
444 {
445 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
446 return false;
447 }
448 MessageParcel datas;
449 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
450 datas.WriteBuffer(data, size);
451 datas.RewindRead(0);
452 MessageParcel reply;
453 MessageOption option;
454 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
455 if (softBusClientStub == nullptr) {
456 return false;
457 }
458 softBusClientStub->OnRemoteRequest(CLIENT_ON_NODE_DEVICE_TRUST_CHANGED, datas, reply, option);
459 return true;
460 }
461
OnHichainProofExceptionInnerTest(const uint8_t * data,size_t size)462 bool OnHichainProofExceptionInnerTest(const uint8_t *data, size_t size)
463 {
464 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
465 return false;
466 }
467 MessageParcel datas;
468 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
469 datas.WriteBuffer(data, size);
470 datas.RewindRead(0);
471 MessageParcel reply;
472 MessageOption option;
473 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
474 if (softBusClientStub == nullptr) {
475 return false;
476 }
477 softBusClientStub->OnRemoteRequest(CLIENT_ON_HICHAIN_PROOF_EXCEPTION, datas, reply, option);
478 return true;
479 }
480
OnNodeOnlineStateChangedInnerTest(const uint8_t * data,size_t size)481 bool OnNodeOnlineStateChangedInnerTest(const uint8_t *data, size_t size)
482 {
483 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
484 return false;
485 }
486 constexpr uint32_t infoTypeLen = 10;
487 bool boolNum = true;
488 const char *test = "test";
489 constexpr size_t len = 4;
490 MessageParcel datas;
491 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
492 datas.WriteBuffer(data, size);
493 datas.WriteBool(boolNum);
494 datas.WriteUint32(infoTypeLen);
495 datas.WriteRawData(test, len);
496 datas.RewindRead(0);
497 MessageParcel reply;
498 MessageOption option;
499 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
500 if (softBusClientStub == nullptr) {
501 return false;
502 }
503 softBusClientStub->OnRemoteRequest(CLIENT_ON_NODE_ONLINE_STATE_CHANGED, datas, reply, option);
504 return true;
505 }
506
OnNodeBasicInfoChangedInnerTest(const uint8_t * data,size_t size)507 bool OnNodeBasicInfoChangedInnerTest(const uint8_t *data, size_t size)
508 {
509 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
510 return false;
511 }
512 constexpr int32_t type = 2;
513 constexpr uint32_t infoTypeLen = 10;
514 const char *test = "test";
515 constexpr size_t len = 4;
516 MessageParcel datas;
517 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
518 datas.WriteBuffer(data, size);
519 datas.WriteRawData(test, len);
520 datas.WriteInt32(type);
521 datas.WriteUint32(infoTypeLen);
522 datas.RewindRead(0);
523 MessageParcel reply;
524 MessageOption option;
525 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
526 if (softBusClientStub == nullptr) {
527 return false;
528 }
529 softBusClientStub->OnRemoteRequest(CLIENT_ON_NODE_BASIC_INFO_CHANGED, datas, reply, option);
530 return true;
531 }
532
OnTimeSyncResultInnerTest(const uint8_t * data,size_t size)533 bool OnTimeSyncResultInnerTest(const uint8_t *data, size_t size)
534 {
535 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
536 return false;
537 }
538 constexpr uint32_t infoTypeLen = 10;
539 int32_t retCode = *(reinterpret_cast<const char *>(data));
540 const char *test = "test";
541 constexpr size_t len = 4;
542 MessageParcel datas;
543 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
544 datas.WriteInt32(retCode);
545 datas.WriteUint32(infoTypeLen);
546 datas.WriteRawData(test, len);
547 datas.RewindRead(0);
548 MessageParcel reply;
549 MessageOption option;
550 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
551 if (softBusClientStub == nullptr) {
552 return false;
553 }
554 softBusClientStub->OnRemoteRequest(CLIENT_ON_TIME_SYNC_RESULT, datas, reply, option);
555 return true;
556 }
557
OnClientEventByReasonAndCode(const uint8_t * data,size_t size,int32_t reason,uint32_t code)558 static bool OnClientEventByReasonAndCode(const uint8_t *data, size_t size, int32_t reason, uint32_t code)
559 {
560 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
561 return false;
562 }
563 int32_t intNum = *(reinterpret_cast<const int32_t *>(data));
564 MessageParcel datas;
565 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
566 datas.WriteInt32(intNum);
567 datas.WriteInt32(reason);
568 datas.RewindRead(0);
569 MessageParcel reply;
570 MessageOption option;
571 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
572 if (softBusClientStub == nullptr) {
573 return false;
574 }
575 softBusClientStub->OnRemoteRequest(code, datas, reply, option);
576 return true;
577 }
578
OnPublishLNNResultInnerTest(const uint8_t * data,size_t size)579 bool OnPublishLNNResultInnerTest(const uint8_t *data, size_t size)
580 {
581 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
582 return false;
583 }
584 constexpr int32_t reason = 2;
585 return OnClientEventByReasonAndCode(data, size, reason, CLIENT_ON_PUBLISH_LNN_RESULT);
586 }
587
OnRefreshLNNResultInnerTest(const uint8_t * data,size_t size)588 bool OnRefreshLNNResultInnerTest(const uint8_t *data, size_t size)
589 {
590 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
591 return false;
592 }
593 constexpr int32_t reason = 8;
594 return OnClientEventByReasonAndCode(data, size, reason, CLIENT_ON_REFRESH_LNN_RESULT);
595 }
596
OnRefreshDeviceFoundInnerTest(const uint8_t * data,size_t size)597 bool OnRefreshDeviceFoundInnerTest(const uint8_t *data, size_t size)
598 {
599 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
600 return false;
601 }
602 uint32_t deviceLen = *(reinterpret_cast<const int32_t *>(data));
603 const char *test = "test";
604 MessageParcel datas;
605 constexpr size_t len = 4;
606 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
607 datas.WriteUint32(deviceLen);
608 datas.WriteRawData(test, len);
609 datas.RewindRead(0);
610 MessageParcel reply;
611 MessageOption option;
612 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
613 if (softBusClientStub == nullptr) {
614 return false;
615 }
616 softBusClientStub->OnRemoteRequest(CLIENT_ON_REFRESH_DEVICE_FOUND, datas, reply, option);
617 return true;
618 }
619
OnClientPermissonChangeInnerTest(const uint8_t * data,size_t size)620 bool OnClientPermissonChangeInnerTest(const uint8_t *data, size_t size)
621 {
622 uint8_t *dataWithEndCharacter = TestDataSwitch(data, size);
623 if (dataWithEndCharacter == nullptr) {
624 return false;
625 }
626 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
627 if (softBusClientStub == nullptr) {
628 return false;
629 }
630
631 int32_t state = *(reinterpret_cast<const int32_t *>(dataWithEndCharacter));
632 char *pkgName = const_cast<char *>(reinterpret_cast<const char *>(dataWithEndCharacter));
633
634 MessageParcel datas;
635 MessageParcel reply;
636 MessageOption option;
637 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
638 datas.WriteInt32(state);
639 datas.WriteCString(pkgName);
640 softBusClientStub->OnRemoteRequest(CLIENT_ON_PERMISSION_CHANGE, datas, reply, option);
641 SoftBusFree(dataWithEndCharacter);
642
643 return true;
644 }
645
OnDiscoverFailedInnerTest(const uint8_t * data,size_t size)646 bool OnDiscoverFailedInnerTest(const uint8_t *data, size_t size)
647 {
648 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
649 return false;
650 }
651 constexpr int32_t reason = 2;
652 return OnClientEventByReasonAndCode(data, size, reason, CLIENT_ON_PUBLISH_LNN_RESULT);
653 }
654
OnDiscoverySuccessInnerTest(const uint8_t * data,size_t size)655 bool OnDiscoverySuccessInnerTest(const uint8_t *data, size_t size)
656 {
657 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
658 return false;
659 }
660 constexpr int32_t reason = 2;
661 return OnClientEventByReasonAndCode(data, size, reason, CLIENT_ON_PUBLISH_LNN_RESULT);
662 }
663
OnPublishSuccessInnerTest(const uint8_t * data,size_t size)664 bool OnPublishSuccessInnerTest(const uint8_t *data, size_t size)
665 {
666 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
667 return false;
668 }
669 constexpr int32_t reason = 2;
670 return OnClientEventByReasonAndCode(data, size, reason, CLIENT_ON_PUBLISH_LNN_RESULT);
671 }
672
OnPublishFailInnerTest(const uint8_t * data,size_t size)673 bool OnPublishFailInnerTest(const uint8_t *data, size_t size)
674 {
675 if (data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
676 return false;
677 }
678 constexpr int32_t reason = 2;
679 return OnClientEventByReasonAndCode(data, size, reason, CLIENT_ON_PUBLISH_LNN_RESULT);
680 }
681
OnClientTransLimitChangeInnerTest(const uint8_t * data,size_t size)682 bool OnClientTransLimitChangeInnerTest(const uint8_t *data, size_t size)
683 {
684 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
685 if (softBusClientStub == nullptr || data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
686 return false;
687 }
688 DataGenerator::Write(data, size);
689
690 int32_t channelId = 0;
691 uint8_t tos = 0;
692 GenerateInt32(channelId);
693 GenerateUint8(tos);
694
695 MessageParcel datas;
696 MessageParcel reply;
697 MessageOption option;
698 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
699 datas.WriteInt32(channelId);
700 datas.WriteUint8(tos);
701 softBusClientStub->OnRemoteRequest(CLIENT_ON_TRANS_LIMIT_CHANGE, datas, reply, option);
702 DataGenerator::Clear();
703
704 return true;
705 }
706
SetChannelInfoInnerTest(const uint8_t * data,size_t size)707 bool SetChannelInfoInnerTest(const uint8_t *data, size_t size)
708 {
709 uint8_t *dataWithEndCharacter = TestDataSwitch(data, size);
710 if (dataWithEndCharacter == nullptr) {
711 return false;
712 }
713 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
714 if (softBusClientStub == nullptr) {
715 return false;
716 }
717 DataGenerator::Write(data, size);
718
719 int32_t sessionId = 0;
720 int32_t channelId = 0;
721 int32_t channelType = 0;
722 GenerateInt32(sessionId);
723 GenerateInt32(channelId);
724 GenerateInt32(channelType);
725 char *sessionName = const_cast<char *>(reinterpret_cast<const char *>(dataWithEndCharacter));
726
727 MessageParcel datas;
728 MessageParcel reply;
729 MessageOption option;
730 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
731 datas.WriteCString(sessionName);
732 datas.WriteInt32(sessionId);
733 datas.WriteInt32(channelId);
734 datas.WriteInt32(channelType);
735 softBusClientStub->OnRemoteRequest(CLIENT_SET_CHANNEL_INFO, datas, reply, option);
736 SoftBusFree(dataWithEndCharacter);
737 DataGenerator::Clear();
738
739 return true;
740 }
741
OnChannelBindInnerTest(const uint8_t * data,size_t size)742 bool OnChannelBindInnerTest(const uint8_t *data, size_t size)
743 {
744 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
745 if (softBusClientStub == nullptr || data == nullptr || size < OHOS::U32_AT_SIZE || size > OHOS::FOO_MAX_LEN) {
746 return false;
747 }
748 DataGenerator::Write(data, size);
749
750 int32_t channelId = 0;
751 int32_t channelType = 0;
752 GenerateInt32(channelId);
753 GenerateInt32(channelType);
754
755 MessageParcel datas;
756 MessageParcel reply;
757 MessageOption option;
758 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
759 datas.WriteInt32(channelId);
760 datas.WriteInt32(channelType);
761 softBusClientStub->OnRemoteRequest(CLIENT_ON_CHANNEL_BIND, datas, reply, option);
762 DataGenerator::Clear();
763
764 return true;
765 }
766
OnChannelOnQosInnerTest(FuzzedDataProvider & provider)767 bool OnChannelOnQosInnerTest(FuzzedDataProvider &provider)
768 {
769 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
770 if (softBusClientStub == nullptr) {
771 return false;
772 }
773 int32_t channelId = provider.ConsumeIntegral<int32_t>();
774 int32_t channelType = provider.ConsumeIntegral<int32_t>();
775 int32_t event = provider.ConsumeIntegral<int32_t>();
776 uint32_t count = provider.ConsumeIntegral<uint32_t>();
777 MessageParcel datas;
778 MessageParcel reply;
779 MessageOption option;
780 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
781 datas.WriteInt32(channelId);
782 datas.WriteInt32(channelType);
783 datas.WriteInt32(event);
784 datas.WriteUint32(count);
785 softBusClientStub->OnRemoteRequest(CLIENT_CHANNEL_ON_QOS, datas, reply, option);
786 return true;
787 }
788
FillCollabInfo(CollabInfo * info,FuzzedDataProvider & provider)789 static bool FillCollabInfo(CollabInfo *info, FuzzedDataProvider &provider)
790 {
791 if (info == NULL) {
792 return false;
793 }
794 std::string providerAccountId = provider.ConsumeBytesAsString(ACCOUNT_UID_LEN_MAX - 1);
795 if (strcpy_s(info->accountId, ACCOUNT_UID_LEN_MAX - 1, providerAccountId.c_str()) != EOK) {
796 return false;
797 }
798 info->tokenId = provider.ConsumeIntegral<uint64_t>();
799 info->userId = provider.ConsumeIntegral<int32_t>();
800 info->pid = provider.ConsumeIntegral<int32_t>();
801 std::string providerDeviceId = provider.ConsumeBytesAsString(DEVICE_ID_LEN_MAX - 1);
802 if (strcpy_s(info->deviceId, DEVICE_ID_LEN_MAX - 1, providerDeviceId.c_str()) != EOK) {
803 return false;
804 }
805 return true;
806 }
807
WriteCollabInfo(MessageParcel & datas,CollabInfo & info)808 static void WriteCollabInfo(MessageParcel &datas, CollabInfo &info)
809 {
810 datas.WriteCString(info.accountId);
811 datas.WriteUint64(info.tokenId);
812 datas.WriteInt32(info.userId);
813 datas.WriteInt32(info.pid);
814 datas.WriteCString(info.deviceId);
815 }
816
OnCheckCollabRelationInnerTest(FuzzedDataProvider & provider)817 bool OnCheckCollabRelationInnerTest(FuzzedDataProvider &provider)
818 {
819 bool isSinkSide = provider.ConsumeBool();
820 int32_t channelId = provider.ConsumeIntegral<uint32_t>();
821 int32_t channelType = provider.ConsumeIntegral<uint32_t>();
822 CollabInfo sourceInfo;
823 (void)memset_s(&sourceInfo, sizeof(CollabInfo), 0, sizeof(CollabInfo));
824 if (!FillCollabInfo(&sourceInfo, provider)) {
825 return false;
826 }
827
828 CollabInfo sinkInfo;
829 (void)memset_s(&sinkInfo, sizeof(CollabInfo), 0, sizeof(CollabInfo));
830 if (!FillCollabInfo(&sinkInfo, provider)) {
831 return false;
832 }
833
834 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
835 if (softBusClientStub == nullptr) {
836 return false;
837 }
838 MessageParcel datas;
839 MessageParcel reply;
840 MessageOption option;
841 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
842 datas.WriteBool(isSinkSide);
843 WriteCollabInfo(datas, sourceInfo);
844 WriteCollabInfo(datas, sinkInfo);
845 datas.WriteInt32(channelId);
846 datas.WriteInt32(channelType);
847 softBusClientStub->OnRemoteRequest(CLIENT_CHECK_COLLAB_RELATION, datas, reply, option);
848 return true;
849 }
850
OnBrProxyOpenedInnerTest(FuzzedDataProvider & provider)851 bool OnBrProxyOpenedInnerTest(FuzzedDataProvider &provider)
852 {
853 int32_t channelId = provider.ConsumeIntegral<int32_t>();
854 int32_t reason = provider.ConsumeIntegral<int32_t>();
855 char brMac[BT_MAC_LEN] = { 0 };
856 char uuid[UUID_STRING_LEN] = { 0 };
857 std::string providerBrMac = provider.ConsumeBytesAsString(BT_MAC_LEN - 1);
858 if (strcpy_s(brMac, BT_MAC_LEN - 1, providerBrMac.c_str()) != EOK) {
859 return false;
860 }
861 std::string providerUuid = provider.ConsumeBytesAsString(UUID_STRING_LEN - 1);
862 if (strcpy_s(uuid, UUID_STRING_LEN - 1, providerUuid.c_str()) != EOK) {
863 return false;
864 }
865 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
866 if (softBusClientStub == nullptr) {
867 return false;
868 }
869 MessageParcel datas;
870 MessageParcel reply;
871 MessageOption option;
872 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
873 datas.WriteInt32(channelId);
874 datas.WriteInt32(reason);
875 datas.WriteCString(brMac);
876 datas.WriteCString(uuid);
877 softBusClientStub->OnRemoteRequest(CLIENT_ON_BR_PROXY_OPENED, datas, reply, option);
878 return true;
879 }
880
OnBrProxyDataRecvInnerTest(FuzzedDataProvider & provider)881 bool OnBrProxyDataRecvInnerTest(FuzzedDataProvider &provider)
882 {
883 int32_t channelId = provider.ConsumeIntegral<int32_t>();
884 uint32_t len = provider.ConsumeIntegralInRange<int32_t>(0, FOO_MAX_LEN);
885 uint8_t dataInfo[FOO_MAX_LEN] = { 0 };
886 std::string providerDataInfo = provider.ConsumeBytesAsString(len - 1);
887 if (strcpy_s((char *)dataInfo, len - 1, providerDataInfo.c_str()) != EOK) {
888 return false;
889 }
890 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
891 if (softBusClientStub == nullptr) {
892 return false;
893 }
894 MessageParcel datas;
895 MessageParcel reply;
896 MessageOption option;
897 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
898 datas.WriteInt32(channelId);
899 datas.WriteUint32(len);
900 datas.WriteRawData(dataInfo, len);
901 softBusClientStub->OnRemoteRequest(CLIENT_ON_BR_PROXY_DATA_RECV, datas, reply, option);
902 return true;
903 }
904
OnBrProxyStateChangedInnerTest(FuzzedDataProvider & provider)905 bool OnBrProxyStateChangedInnerTest(FuzzedDataProvider &provider)
906 {
907 int32_t channelId = provider.ConsumeIntegral<int32_t>();
908 int32_t errCode = provider.ConsumeIntegral<int32_t>();
909 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
910 if (softBusClientStub == nullptr) {
911 return false;
912 }
913 MessageParcel datas;
914 MessageParcel reply;
915 MessageOption option;
916 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
917 datas.WriteInt32(channelId);
918 datas.WriteInt32(errCode);
919 softBusClientStub->OnRemoteRequest(CLIENT_ON_BR_PROXY_STATE_CHANGED, datas, reply, option);
920 return true;
921 }
922
OnBrProxyQueryPermissionInnerTest(FuzzedDataProvider & provider)923 bool OnBrProxyQueryPermissionInnerTest(FuzzedDataProvider &provider)
924 {
925 char bundleName[HAP_NAME_MAX_LEN] = { 0 };
926 std::string providerBundleName = provider.ConsumeBytesAsString(HAP_NAME_MAX_LEN - 1);
927 if (strcpy_s(bundleName, HAP_NAME_MAX_LEN - 1, providerBundleName.c_str()) != EOK) {
928 return false;
929 }
930 sptr<OHOS::SoftBusClientStub> softBusClientStub = new OHOS::SoftBusClientStub();
931 if (softBusClientStub == nullptr) {
932 return false;
933 }
934 MessageParcel datas;
935 MessageParcel reply;
936 MessageOption option;
937 datas.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
938 datas.WriteCString(bundleName);
939 softBusClientStub->OnRemoteRequest(CLIENT_ON_BR_PROXY_QUERY_PERMISSION, datas, reply, option);
940 return true;
941 }
942
943 } // namespace OHOS
944
945 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)946 extern "C" int32_t LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
947 {
948 static OHOS::TestEnv env;
949 if (!env.IsInited()) {
950 return 0;
951 }
952 OHOS::OnChannelOpenedInnerTest(data, size);
953 OHOS::OnChannelOpenFailedInnerTest(data, size);
954 OHOS::OnChannelLinkDownInnerTest(data, size);
955 OHOS::OnChannelClosedInnerTest(data, size);
956 OHOS::OnChannelMsgReceivedInnerTest(data, size);
957 OHOS::OnChannelQosEventInnerTest(data, size);
958 OHOS::OnDeviceFoundInnerTest(data, size);
959 OHOS::OnJoinLNNResultInnerTest(data, size);
960 OHOS::OnJoinMetaNodeResultInnerTest(data, size);
961 OHOS::OnLeaveLNNResultInnerTest(data, size);
962 OHOS::OnLeaveMetaNodeResultInnerTest(data, size);
963 OHOS::OnHichainProofExceptionInnerTest(data, size);
964 OHOS::OnNodeOnlineStateChangedInnerTest(data, size);
965 OHOS::OnNodeBasicInfoChangedInnerTest(data, size);
966 OHOS::OnTimeSyncResultInnerTest(data, size);
967 OHOS::OnPublishLNNResultInnerTest(data, size);
968 OHOS::OnRefreshLNNResultInnerTest(data, size);
969 OHOS::OnRefreshDeviceFoundInnerTest(data, size);
970 OHOS::OnClientPermissonChangeInnerTest(data, size);
971 OHOS::OnDiscoverFailedInnerTest(data, size);
972 OHOS::OnDiscoverySuccessInnerTest(data, size);
973 OHOS::OnPublishSuccessInnerTest(data, size);
974 OHOS::OnPublishFailInnerTest(data, size);
975 OHOS::OnClientTransLimitChangeInnerTest(data, size);
976 OHOS::SetChannelInfoInnerTest(data, size);
977 OHOS::OnChannelBindInnerTest(data, size);
978 FuzzedDataProvider provider(data, size);
979 OHOS::OnChannelOnQosInnerTest(provider);
980 OHOS::OnCheckCollabRelationInnerTest(provider);
981 OHOS::OnBrProxyOpenedInnerTest(provider);
982 OHOS::OnBrProxyDataRecvInnerTest(provider);
983 OHOS::OnBrProxyStateChangedInnerTest(provider);
984 OHOS::OnBrProxyQueryPermissionInnerTest(provider);
985 return 0;
986 }
987