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 "serverstub_fuzzer.h"
20 #include "message_parcel.h"
21 #include "securec.h"
22 #include "dhcp_server_service_impl.h"
23 #include "dhcp_server_stub.h"
24 #include "dhcp_manager_service_ipc_interface_code.h"
25 #include "dhcp_fuzz_common_func.h"
26
27 namespace OHOS {
28 namespace DHCP {
29 constexpr size_t U32_AT_SIZE_ZERO = 4;
30 constexpr size_t MAP_SCAN_NUMS = 12;
31 constexpr size_t DHCP_SLEEP_1 = 2;
32 const std::u16string FORMMGR_INTERFACE_TOKEN = u"ohos.wifi.IDhcpServer";
33 sptr<DhcpServerStub> pDhcpServerStub = DhcpServerServiceImpl::GetInstance();
34
OnGetSupportedFeaturesTest(const uint8_t* data, size_t size)35 void OnGetSupportedFeaturesTest(const uint8_t* data, size_t size)
36 {
37 uint32_t code = U32_AT(data) % MAP_SCAN_NUMS + static_cast<uint32_t>
38 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REG_CALL_BACK);
39 if (code == static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_GET_SERVER_STATUS) ||
40 code == static_cast<uint32_t>(DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_GET_IP_LIST)) {
41 return;
42 }
43 MessageParcel datas;
44 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
45 datas.WriteInt32(0);
46 datas.WriteBuffer(data, size);
47 datas.RewindRead(0);
48 MessageParcel reply;
49 MessageOption option;
50 pDhcpServerStub->OnRemoteRequest(code, datas, reply, option);
51 }
52
OnRegisterCallBackTest(const uint8_t* data, size_t size)53 void OnRegisterCallBackTest(const uint8_t* data, size_t size)
54 {
55 MessageParcel datas;
56 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
57 datas.WriteInt32(0);
58 datas.WriteBuffer(data, size);
59 datas.RewindRead(0);
60 MessageParcel reply;
61 MessageOption option;
62 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
63 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REG_CALL_BACK), datas, reply, option);
64 }
65
OnStopDhcpServerTest(const uint8_t* data, size_t size)66 void OnStopDhcpServerTest(const uint8_t* data, size_t size)
67 {
68 MessageParcel datas;
69 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
70 datas.WriteInt32(0);
71 datas.WriteBuffer(data, size);
72 datas.RewindRead(0);
73 MessageParcel reply;
74 MessageOption option;
75 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
76 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_STOP_DHCP_SERVER), datas, reply, option);
77 }
78
OnSetDhcpNameTest(const uint8_t* data, size_t size)79 void OnSetDhcpNameTest(const uint8_t* data, size_t size)
80 {
81 MessageParcel datas;
82 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
83 datas.WriteInt32(0);
84 datas.WriteBuffer(data, size);
85 datas.RewindRead(0);
86 MessageParcel reply;
87 MessageOption option;
88 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
89 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_SET_DHCP_NAME), datas, reply, option);
90 }
91
OnSetDhcpRangeTest(const uint8_t* data, size_t size)92 void OnSetDhcpRangeTest(const uint8_t* data, size_t size)
93 {
94 MessageParcel datas;
95 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
96 datas.WriteInt32(0);
97 datas.WriteBuffer(data, size);
98 datas.RewindRead(0);
99 MessageParcel reply;
100 MessageOption option;
101 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
102 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_SET_DHCP_RANGE), datas, reply, option);
103 }
104
OnRemoveAllDhcpRangeTest(const uint8_t* data, size_t size)105 void OnRemoveAllDhcpRangeTest(const uint8_t* data, size_t size)
106 {
107 MessageParcel datas;
108 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
109 datas.WriteInt32(0);
110 datas.WriteBuffer(data, size);
111 datas.RewindRead(0);
112 MessageParcel reply;
113 MessageOption option;
114 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
115 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REMOVE_ALL_DHCP_RANGE), datas, reply, option);
116 }
117
OnRemoveDhcpRangeTest(const uint8_t* data, size_t size)118 void OnRemoveDhcpRangeTest(const uint8_t* data, size_t size)
119 {
120 MessageParcel datas;
121 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
122 datas.WriteInt32(0);
123 datas.WriteBuffer(data, size);
124 datas.RewindRead(0);
125 MessageParcel reply;
126 MessageOption option;
127 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
128 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_REMOVE_DHCP_RANGE), datas, reply, option);
129 }
130
OnGetDhcpClientInfosTest(const uint8_t* data, size_t size)131 void OnGetDhcpClientInfosTest(const uint8_t* data, size_t size)
132 {
133 MessageParcel datas;
134 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
135 datas.WriteInt32(0);
136 datas.WriteBuffer(data, size);
137 datas.RewindRead(0);
138 MessageParcel reply;
139 MessageOption option;
140 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
141 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_GET_DHCP_CLIENT_INFO), datas, reply, option);
142 }
143
OnUpdateLeasesTimeTest(const uint8_t* data, size_t size)144 void OnUpdateLeasesTimeTest(const uint8_t* data, size_t size)
145 {
146 MessageParcel datas;
147 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
148 datas.WriteInt32(0);
149 datas.WriteBuffer(data, size);
150 datas.RewindRead(0);
151 MessageParcel reply;
152 MessageOption option;
153 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
154 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_UPDATE_RENEW_TIME), datas, reply, option);
155 }
156
OnPutDhcpRangeTest(const uint8_t* data, size_t size)157 void OnPutDhcpRangeTest(const uint8_t* data, size_t size)
158 {
159 MessageParcel datas;
160 datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
161 datas.WriteInt32(0);
162 datas.WriteBuffer(data, size);
163 datas.RewindRead(0);
164 MessageParcel reply;
165 MessageOption option;
166 pDhcpServerStub->OnRemoteRequest(static_cast<uint32_t>
167 (DhcpServerInterfaceCode::DHCP_SERVER_SVR_CMD_PUT_DHCP_RANGE), datas, reply, option);
168 }
169
170 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)171 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
172 {
173 if ((data == nullptr) || (size <= OHOS::DHCP::U32_AT_SIZE_ZERO)) {
174 return 0;
175 }
176 sleep(DHCP_SLEEP_1);
177 OHOS::DHCP::OnGetSupportedFeaturesTest(data, size);
178 OHOS::DHCP::OnRegisterCallBackTest(data, size);
179 OHOS::DHCP::OnStopDhcpServerTest(data, size);
180 OHOS::DHCP::OnSetDhcpNameTest(data, size);
181 OHOS::DHCP::OnSetDhcpRangeTest(data, size);
182 OHOS::DHCP::OnRemoveAllDhcpRangeTest(data, size);
183 OHOS::DHCP::OnRemoveDhcpRangeTest(data, size);
184 OHOS::DHCP::OnGetDhcpClientInfosTest(data, size);
185 OHOS::DHCP::OnUpdateLeasesTimeTest(data, size);
186 OHOS::DHCP::OnPutDhcpRangeTest(data, size);
187 return 0;
188 }
189 } // namespace DHCP
190 } // namespace OHOS
191