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