1 /*
2  * Copyright (c) 2022 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 "clienttransudpmanager_fuzzer.h"
17 
18 #include <securec.h>
19 
20 #include "session.h"
21 #include "client_trans_udp_manager.h"
22 
23 #define STR_LEN 100000
24 #define TEST_TMP_STR_LEN 50
25 #define TEST_TMP_STR "testtmpStr"
26 namespace OHOS {
TransOnUdpChannelOpenedTest(const uint8_t* data, size_t size)27     void TransOnUdpChannelOpenedTest(const uint8_t* data, size_t size)
28     {
29         if ((data == nullptr) || (size == 0)) {
30             return;
31         }
32         ChannelInfo channel = {0};
33         channel.channelType = CHANNEL_TYPE_UDP;
34         channel.businessType = BUSINESS_TYPE_STREAM;
35         int32_t udpPort = size;
36         TransOnUdpChannelOpened((char *)data, &channel, &udpPort);
37     }
38 
TransOnUdpChannelOpenFailedTest(const uint8_t* data, size_t size)39     void TransOnUdpChannelOpenFailedTest(const uint8_t* data, size_t size)
40     {
41         if ((data == nullptr) || (size == 0)) {
42             return;
43         }
44         TransOnUdpChannelOpenFailed((int32_t)size, (int32_t)size);
45     }
46 
TransOnUdpChannelClosedTest(const uint8_t* data, size_t size)47     void TransOnUdpChannelClosedTest(const uint8_t* data, size_t size)
48     {
49         if ((data == nullptr) || (size == 0)) {
50             return;
51         }
52         TransOnUdpChannelClosed((int32_t)size, SHUTDOWN_REASON_UNKNOWN);
53     }
54 
TransOnUdpChannelQosEventTest(const uint8_t* data, size_t size)55     void TransOnUdpChannelQosEventTest(const uint8_t* data, size_t size)
56     {
57         if ((data == nullptr) || (size == 0)) {
58             return;
59         }
60         QosTv tvList;
61         TransOnUdpChannelQosEvent((int32_t)size, (int32_t)size, (int32_t)size, &tvList);
62     }
63 
ClientTransCloseUdpChannelTest(const uint8_t* data, size_t size)64     void ClientTransCloseUdpChannelTest(const uint8_t* data, size_t size)
65     {
66         if ((data == nullptr) || (size == 0)) {
67             return;
68         }
69         ClientTransCloseUdpChannel((int32_t)size, SHUTDOWN_REASON_UNKNOWN);
70     }
71 
TransUdpChannelSendStreamTest(const uint8_t* data, size_t size)72     void TransUdpChannelSendStreamTest(const uint8_t* data, size_t size)
73     {
74         if ((data == nullptr) || (size == 0)) {
75             return;
76         }
77         char sendStringData[STR_LEN] = {0};
78         StreamData streamdata1 = {
79             sendStringData,
80             100000,
81         };
82         char str[TEST_TMP_STR_LEN] = TEST_TMP_STR;
83         StreamData streamdata2 = {
84             str,
85             10,
86         };
87         StreamFrameInfo ext = {};
88         TransUdpChannelSendStream((int32_t)size, &streamdata1, &streamdata2, &ext);
89     }
90 
TransUdpChannelSendFileTest(const uint8_t* data, size_t size)91     void TransUdpChannelSendFileTest(const uint8_t* data, size_t size)
92     {
93         if ((data == nullptr) || (size == 0)) {
94             return;
95         }
96         const char *sfileList[] = {
97             "/data/big.tar",
98             "/data/richu.jpg",
99             "/data/richu-002.jpg",
100             "/data/richu-003.jpg",
101         };
102         TransUdpChannelSendFile((int32_t)size, sfileList, NULL, (uint32_t)size);
103     }
104 
TransGetUdpChannelByFileIdTest(const uint8_t* data, size_t size)105     void TransGetUdpChannelByFileIdTest(const uint8_t* data, size_t size)
106     {
107         if ((data == nullptr) || (size == 0)) {
108             return;
109         }
110         UdpChannel udpChannel;
111         TransGetUdpChannelByFileId((int32_t)size, &udpChannel);
112     }
113 
TransUdpDeleteFileListenerlTest(const uint8_t* data, size_t size)114     void TransUdpDeleteFileListenerlTest(const uint8_t* data, size_t size)
115     {
116         if ((data == nullptr) || (size < SESSION_NAME_SIZE_MAX)) {
117             return;
118         }
119         char tmp[SESSION_NAME_SIZE_MAX + 1] = {0};
120         if (memcpy_s(tmp, sizeof(tmp) - 1, data, sizeof(tmp) - 1) != EOK) {
121             return;
122         }
123         TransUdpDeleteFileListener(tmp);
124     }
125 } // namespace OHOS
126 
127 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)128 extern "C" int32_t LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
129 {
130     OHOS::TransOnUdpChannelOpenedTest(data, size);
131     OHOS::TransOnUdpChannelOpenFailedTest(data, size);
132     OHOS::TransOnUdpChannelClosedTest(data, size);
133     OHOS::TransOnUdpChannelQosEventTest(data, size);
134     OHOS::ClientTransCloseUdpChannelTest(data, size);
135     OHOS::TransUdpChannelSendStreamTest(data, size);
136     OHOS::TransUdpChannelSendFileTest(data, size);
137     OHOS::TransGetUdpChannelByFileIdTest(data, size);
138     OHOS::TransUdpDeleteFileListenerlTest(data, size);
139     return 0;
140 }
141