1 /*
2  * Copyright (c) 2022-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 "clienttransudpmanager_fuzzer.h"
17 
18 #include <securec.h>
19 
20 #include "client_trans_udp_manager.h"
21 #include "session.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(static_cast<int32_t>(size), static_cast<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(static_cast<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(
62             static_cast<int32_t>(size), static_cast<int32_t>(size), static_cast<int32_t>(size), &tvList);
63     }
64 
ClientTransCloseUdpChannelTest(const uint8_t * data,size_t size)65     void ClientTransCloseUdpChannelTest(const uint8_t *data, size_t size)
66     {
67         if ((data == nullptr) || (size == 0)) {
68             return;
69         }
70         ClientTransCloseUdpChannel(static_cast<int32_t>(size), SHUTDOWN_REASON_UNKNOWN);
71     }
72 
TransUdpChannelSendStreamTest(const uint8_t * data,size_t size)73     void TransUdpChannelSendStreamTest(const uint8_t *data, size_t size)
74     {
75         if ((data == nullptr) || (size == 0)) {
76             return;
77         }
78         char sendStringData[STR_LEN] = {0};
79         StreamData streamdata1 = {
80             sendStringData,
81             100000,
82         };
83         char str[TEST_TMP_STR_LEN] = TEST_TMP_STR;
84         StreamData streamdata2 = {
85             str,
86             10,
87         };
88         StreamFrameInfo ext = {};
89         TransUdpChannelSendStream(static_cast<int32_t>(size), &streamdata1, &streamdata2, &ext);
90     }
91 
TransUdpChannelSendFileTest(const uint8_t * data,size_t size)92     void TransUdpChannelSendFileTest(const uint8_t *data, size_t size)
93     {
94         if ((data == nullptr) || (size == 0)) {
95             return;
96         }
97         const char *sfileList[] = {
98             "/data/big.tar",
99             "/data/richu.jpg",
100             "/data/richu-002.jpg",
101             "/data/richu-003.jpg",
102         };
103         TransUdpChannelSendFile(static_cast<int32_t>(size), sfileList, NULL, static_cast<uint32_t>(size));
104     }
105 
TransGetUdpChannelByFileIdTest(const uint8_t * data,size_t size)106     void TransGetUdpChannelByFileIdTest(const uint8_t *data, size_t size)
107     {
108         if ((data == nullptr) || (size == 0)) {
109             return;
110         }
111         UdpChannel udpChannel;
112         TransGetUdpChannelByFileId(static_cast<int32_t>(size), &udpChannel);
113     }
114 
TransUdpDeleteFileListenerlTest(const uint8_t * data,size_t size)115     void TransUdpDeleteFileListenerlTest(const uint8_t *data, size_t size)
116     {
117         if ((data == nullptr) || (size < SESSION_NAME_SIZE_MAX)) {
118             return;
119         }
120         char tmp[SESSION_NAME_SIZE_MAX + 1] = {0};
121         if (memcpy_s(tmp, sizeof(tmp) - 1, data, sizeof(tmp) - 1) != EOK) {
122             return;
123         }
124         TransUdpDeleteFileListener(tmp);
125     }
126 } // namespace OHOS
127 
128 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)129 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
130 {
131     OHOS::TransOnUdpChannelOpenedTest(data, size);
132     OHOS::TransOnUdpChannelOpenFailedTest(data, size);
133     OHOS::TransOnUdpChannelClosedTest(data, size);
134     OHOS::TransOnUdpChannelQosEventTest(data, size);
135     OHOS::ClientTransCloseUdpChannelTest(data, size);
136     OHOS::TransUdpChannelSendStreamTest(data, size);
137     OHOS::TransUdpChannelSendFileTest(data, size);
138     OHOS::TransGetUdpChannelByFileIdTest(data, size);
139     OHOS::TransUdpDeleteFileListenerlTest(data, size);
140     return 0;
141 }
142