• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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