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 #include <cstddef>
17 #include <cstdint>
18 #include <unistd.h>
19 #include "dhcpserverimpl_fuzzer.h"
20 #include "securec.h"
21 #include "dhcp_server_service_impl.h"
22 #include "dhcp_server_death_recipient.h"
23 #include "iremote_object.h"
24
25 namespace OHOS {
26 namespace DHCP {
27 constexpr size_t U32_AT_SIZE_ZERO = 4;
28 constexpr size_t DHCP_SLEEP_1 = 2;
29 sptr<DhcpServerServiceImpl> pDhcpServerServiceImpl = DhcpServerServiceImpl::GetInstance();
30
OnStartTest(const uint8_t* data, size_t size)31 void OnStartTest(const uint8_t* data, size_t size)
32 {
33 pDhcpServerServiceImpl->OnStart();
34 }
35
OnStopTest(const uint8_t* data, size_t size)36 void OnStopTest(const uint8_t* data, size_t size)
37 {
38 pDhcpServerServiceImpl->OnStop();
39 }
40
StartDhcpServerTest(const uint8_t* data, size_t size)41 void StartDhcpServerTest(const uint8_t* data, size_t size)
42 {
43 std::string ifname = "";
44 pDhcpServerServiceImpl->StartDhcpServer(ifname);
45 }
46
StopDhcpServerTest(const uint8_t* data, size_t size)47 void StopDhcpServerTest(const uint8_t* data, size_t size)
48 {
49 std::string ifname1 = "wlan0";
50 std::string ifname2 = "";
51 pDhcpServerServiceImpl->StopDhcpServer(ifname1);
52 pDhcpServerServiceImpl->StopDhcpServer(ifname2);
53 }
54
PutDhcpRangeTest(const uint8_t* data, size_t size)55 void PutDhcpRangeTest(const uint8_t* data, size_t size)
56 {
57 std::string tagName = "sta";
58 DhcpRange range;
59 range.iptype = 0;
60 pDhcpServerServiceImpl->PutDhcpRange(tagName, range);
61 pDhcpServerServiceImpl->PutDhcpRange("", range);
62 }
63
RemoveDhcpRangeTest(const uint8_t* data, size_t size)64 void RemoveDhcpRangeTest(const uint8_t* data, size_t size)
65 {
66 std::string tagName = "sta";
67 DhcpRange range;
68 range.iptype = 0;
69 pDhcpServerServiceImpl->RemoveDhcpRange(tagName, range);
70 pDhcpServerServiceImpl->RemoveDhcpRange("", range);
71 }
72
RemoveAllDhcpRangeTest(const uint8_t* data, size_t size)73 void RemoveAllDhcpRangeTest(const uint8_t* data, size_t size)
74 {
75 std::string tagName1 = "sta";
76 std::string tagName2 = "";
77 pDhcpServerServiceImpl->RemoveAllDhcpRange(tagName1);
78 pDhcpServerServiceImpl->RemoveAllDhcpRange(tagName2);
79 }
80
SetDhcpRangeTest(const uint8_t* data, size_t size)81 void SetDhcpRangeTest(const uint8_t* data, size_t size)
82 {
83 std::string ifname = "wlan0";
84 DhcpRange range;
85 range.iptype = 0;
86 pDhcpServerServiceImpl->SetDhcpRange(ifname, range);
87 }
88
SetDhcpNameTest(const uint8_t* data, size_t size)89 void SetDhcpNameTest(const uint8_t* data, size_t size)
90 {
91 std::string ifname = "wlan0";
92 std::string tagName = "sta";
93 pDhcpServerServiceImpl->SetDhcpName(ifname, tagName);
94 pDhcpServerServiceImpl->SetDhcpName("", tagName);
95 pDhcpServerServiceImpl->SetDhcpName(ifname, "");
96 pDhcpServerServiceImpl->SetDhcpName("", "");
97 }
98
GetDhcpClientInfosTest(const uint8_t* data, size_t size)99 void GetDhcpClientInfosTest(const uint8_t* data, size_t size)
100 {
101 std::string ifname1 = "";
102 std::string ifname2 = "wlan0";
103 std::vector<std::string> leases;
104 leases.push_back(std::string(reinterpret_cast<const char*>(data), size));
105 pDhcpServerServiceImpl->GetDhcpClientInfos(ifname1, leases);
106 pDhcpServerServiceImpl->GetDhcpClientInfos(ifname2, leases);
107 }
108
UpdateLeasesTimeTest(const uint8_t* data, size_t size)109 void UpdateLeasesTimeTest(const uint8_t* data, size_t size)
110 {
111 std::string leaseTime = std::string(reinterpret_cast<const char*>(data), size);
112 pDhcpServerServiceImpl->UpdateLeasesTime(leaseTime);
113 }
114
IsRemoteDiedTest(const uint8_t* data, size_t size)115 void IsRemoteDiedTest(const uint8_t* data, size_t size)
116 {
117 pDhcpServerServiceImpl->IsRemoteDied();
118 }
119
DeleteLeaseFileTest(const uint8_t* data, size_t size)120 void DeleteLeaseFileTest(const uint8_t* data, size_t size)
121 {
122 std::string ifname = "wlan0";
123 pDhcpServerServiceImpl->DeleteLeaseFile(ifname);
124 }
125
CheckAndUpdateConfTest(const uint8_t* data, size_t size)126 void CheckAndUpdateConfTest(const uint8_t* data, size_t size)
127 {
128 std::string ifname1 = "";
129 std::string ifname2 = "wlan0";
130 pDhcpServerServiceImpl->CheckAndUpdateConf(ifname1);
131 pDhcpServerServiceImpl->CheckAndUpdateConf(ifname2);
132 }
133
CheckIpAddrRangeTest(const uint8_t* data, size_t size)134 void CheckIpAddrRangeTest(const uint8_t* data, size_t size)
135 {
136 DhcpRange range;
137 int call = 2;
138 range.strTagName = std::string(reinterpret_cast<const char*>(data), size);
139 range.strStartip = std::string(reinterpret_cast<const char*>(data), size);
140 range.strEndip = std::string(reinterpret_cast<const char*>(data), size);
141 range.strSubnet = std::string(reinterpret_cast<const char*>(data), size);
142 range.iptype = static_cast<int>(data[0]) % call;
143 range.leaseHours = static_cast<int>(data[0]);
144 pDhcpServerServiceImpl->CheckIpAddrRange(range);
145 }
146
AddSpecifiedInterfaceTest(const uint8_t* data, size_t size)147 void AddSpecifiedInterfaceTest(const uint8_t* data, size_t size)
148 {
149 std::string ifname = "wlan0";
150 pDhcpServerServiceImpl->AddSpecifiedInterface(ifname);
151 }
152
GetUsingIpRangeTest(const uint8_t* data, size_t size)153 void GetUsingIpRangeTest(const uint8_t* data, size_t size)
154 {
155 std::string ifname1 = "";
156 std::string ifname2 = "ww";
157 std::string ifname3 = "wlan0";
158 std::string ipRange = std::string(reinterpret_cast<const char*>(data), size);
159 pDhcpServerServiceImpl->GetUsingIpRange(ifname1, ipRange);
160 pDhcpServerServiceImpl->GetUsingIpRange(ifname2, ipRange);
161 pDhcpServerServiceImpl->GetUsingIpRange(ifname3, ipRange);
162 }
163
CreateDefaultConfigFileTest(const uint8_t* data, size_t size)164 void CreateDefaultConfigFileTest(const uint8_t* data, size_t size)
165 {
166 std::string strFile = std::string(reinterpret_cast<const char*>(data), size);
167 pDhcpServerServiceImpl->CreateDefaultConfigFile(strFile);
168 }
169
UnregisterSignalTest(const uint8_t* data, size_t size)170 void UnregisterSignalTest(const uint8_t* data, size_t size)
171 {
172 pDhcpServerServiceImpl->UnregisterSignal();
173 }
174
DelSpecifiedInterfaceTest(const uint8_t* data, size_t size)175 void DelSpecifiedInterfaceTest(const uint8_t* data, size_t size)
176 {
177 std::string ifname = std::string(reinterpret_cast<const char*>(data), size);
178 pDhcpServerServiceImpl->DelSpecifiedInterface(ifname);
179 }
180
RegisterDhcpServerCallBackTest(const uint8_t* data, size_t size)181 void RegisterDhcpServerCallBackTest(const uint8_t* data, size_t size)
182 {
183 std::string ifname = std::string(reinterpret_cast<const char*>(data), size);
184 sptr<IDhcpServerCallBack> serverCallback;
185 pDhcpServerServiceImpl->RegisterDhcpServerCallBack(ifname, serverCallback);
186 }
187
StartServiceAbilityTest(const uint8_t* data, size_t size)188 void StartServiceAbilityTest(const uint8_t* data, size_t size)
189 {
190 int index = 0;
191 int sleepS = static_cast<int>(index++);
192 pDhcpServerServiceImpl->StartServiceAbility(sleepS);
193 }
194
195 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)196 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
197 {
198 if ((data == nullptr) || (size <= OHOS::DHCP::U32_AT_SIZE_ZERO)) {
199 return 0;
200 }
201 sleep(DHCP_SLEEP_1);
202 OHOS::DHCP::OnStartTest(data, size);
203 OHOS::DHCP::OnStopTest(data, size);
204 OHOS::DHCP::StartDhcpServerTest(data, size);
205 OHOS::DHCP::StopDhcpServerTest(data, size);
206 OHOS::DHCP::PutDhcpRangeTest(data, size);
207 OHOS::DHCP::RemoveDhcpRangeTest(data, size);
208 OHOS::DHCP::RemoveAllDhcpRangeTest(data, size);
209 OHOS::DHCP::SetDhcpRangeTest(data, size);
210 OHOS::DHCP::SetDhcpNameTest(data, size);
211 OHOS::DHCP::GetDhcpClientInfosTest(data, size);
212 OHOS::DHCP::UpdateLeasesTimeTest(data, size);
213 OHOS::DHCP::IsRemoteDiedTest(data, size);
214 OHOS::DHCP::DeleteLeaseFileTest(data, size);
215 OHOS::DHCP::CheckAndUpdateConfTest(data, size);
216 OHOS::DHCP::CheckIpAddrRangeTest(data, size);
217 OHOS::DHCP::AddSpecifiedInterfaceTest(data, size);
218 OHOS::DHCP::GetUsingIpRangeTest(data, size);
219 OHOS::DHCP::CreateDefaultConfigFileTest(data, size);
220 OHOS::DHCP::UnregisterSignalTest(data, size);
221 OHOS::DHCP::DelSpecifiedInterfaceTest(data, size);
222 OHOS::DHCP::RegisterDhcpServerCallBackTest(data, size);
223 OHOS::DHCP::StartServiceAbilityTest(data, size);
224 return 0;
225 }
226 } // namespace DHCP
227 } // namespace OHOS
228