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 "updateiccdiallingnumbers_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20 #include <thread>
21
22 #define private public
23 #include "addcoreservicetoken_fuzzer.h"
24 #include "core_service.h"
25 #include "napi_util.h"
26 #include "system_ability_definition.h"
27 #include "tel_event_handler.h"
28 #include "unistd.h"
29
30 using namespace OHOS::Telephony;
31 namespace OHOS {
32 static bool g_isInited = false;
33 constexpr int32_t SLOT_NUM = 2;
34 constexpr int32_t ACCEPT_TYPE = 2;
35 constexpr int32_t SIM_TYPE_NUM = 2;
36 constexpr int32_t SLEEP_TIME_SECONDS = 2;
37
IsServiceInited()38 bool IsServiceInited()
39 {
40 if (!g_isInited) {
41 DelayedSingleton<CoreService>::GetInstance()->OnStart();
42 if (DelayedSingleton<CoreService>::GetInstance()->GetServiceRunningState() ==
43 static_cast<int32_t>(ServiceRunningState::STATE_RUNNING)) {
44 g_isInited = true;
45 }
46 }
47 return g_isInited;
48 }
49
GetOpKey(const uint8_t * data,size_t size)50 void GetOpKey(const uint8_t *data, size_t size)
51 {
52 if (!IsServiceInited()) {
53 return;
54 }
55
56 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
57 MessageParcel dataMessageParcel;
58 dataMessageParcel.WriteInt32(slotId);
59 dataMessageParcel.WriteBuffer(data, size);
60 dataMessageParcel.RewindRead(0);
61 MessageParcel reply;
62 DelayedSingleton<CoreService>::GetInstance()->OnGetOpKey(dataMessageParcel, reply);
63 }
64
GetOpKeyExt(const uint8_t * data,size_t size)65 void GetOpKeyExt(const uint8_t *data, size_t size)
66 {
67 if (!IsServiceInited()) {
68 return;
69 }
70
71 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
72 MessageParcel dataMessageParcel;
73 dataMessageParcel.WriteInt32(slotId);
74
75 dataMessageParcel.WriteBuffer(data, size);
76 dataMessageParcel.RewindRead(0);
77 MessageParcel reply;
78 DelayedSingleton<CoreService>::GetInstance()->OnGetOpKeyExt(dataMessageParcel, reply);
79 }
80
GetOpName(const uint8_t * data,size_t size)81 void GetOpName(const uint8_t *data, size_t size)
82 {
83 if (!IsServiceInited()) {
84 return;
85 }
86
87 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
88 MessageParcel dataMessageParcel;
89 dataMessageParcel.WriteInt32(slotId);
90
91 dataMessageParcel.WriteBuffer(data, size);
92 dataMessageParcel.RewindRead(0);
93 MessageParcel reply;
94 DelayedSingleton<CoreService>::GetInstance()->OnGetOpName(dataMessageParcel, reply);
95 }
96
SendCallSetupRequestResult(const uint8_t * data,size_t size)97 void SendCallSetupRequestResult(const uint8_t *data, size_t size)
98 {
99 if (!IsServiceInited()) {
100 return;
101 }
102
103 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
104 int32_t accept = static_cast<int32_t>(*data % ACCEPT_TYPE);
105 MessageParcel dataMessageParcel;
106 dataMessageParcel.WriteInt32(slotId);
107 dataMessageParcel.WriteInt32(accept);
108
109 dataMessageParcel.WriteBuffer(data, size);
110 dataMessageParcel.RewindRead(0);
111 MessageParcel reply;
112 DelayedSingleton<CoreService>::GetInstance()->OnSendCallSetupRequestResult(dataMessageParcel, reply);
113 }
114
HasOperatorPrivileges(const uint8_t * data,size_t size)115 void HasOperatorPrivileges(const uint8_t *data, size_t size)
116 {
117 if (!IsServiceInited()) {
118 return;
119 }
120
121 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
122 MessageParcel dataMessageParcel;
123 dataMessageParcel.WriteInt32(slotId);
124
125 dataMessageParcel.WriteBuffer(data, size);
126 dataMessageParcel.RewindRead(0);
127 MessageParcel reply;
128 DelayedSingleton<CoreService>::GetInstance()->OnHasOperatorPrivileges(dataMessageParcel, reply);
129 }
130
GetCellInfoList(const uint8_t * data,size_t size)131 void GetCellInfoList(const uint8_t *data, size_t size)
132 {
133 if (!IsServiceInited()) {
134 return;
135 }
136
137 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
138 MessageParcel dataMessageParcel;
139 dataMessageParcel.WriteInt32(slotId);
140
141 dataMessageParcel.WriteBuffer(data, size);
142 dataMessageParcel.RewindRead(0);
143 MessageParcel reply;
144 DelayedSingleton<CoreService>::GetInstance()->OnGetCellInfoList(dataMessageParcel, reply);
145 }
146
UpdateIccDiallingNumbers(const uint8_t * data,size_t size)147 void UpdateIccDiallingNumbers(const uint8_t *data, size_t size)
148 {
149 if (!IsServiceInited()) {
150 return;
151 }
152
153 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
154 int32_t type = *data % SIM_TYPE_NUM + 1;
155 MessageParcel dataMessageParcel;
156 dataMessageParcel.WriteInt32(slotId);
157 dataMessageParcel.WriteInt32(type);
158 dataMessageParcel.WriteBuffer(data, size);
159 dataMessageParcel.RewindRead(0);
160 MessageParcel reply;
161 DelayedSingleton<CoreService>::GetInstance()->OnUpdateIccDiallingNumbers(dataMessageParcel, reply);
162 }
163
GetNrSsbIdInfoTesting(const uint8_t * data,size_t size)164 void GetNrSsbIdInfoTesting(const uint8_t *data, size_t size)
165 {
166 if (!IsServiceInited()) {
167 return;
168 }
169
170 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
171 MessageParcel dataMessageParcel;
172 dataMessageParcel.WriteInt32(slotId);
173
174 dataMessageParcel.WriteBuffer(data, size);
175 dataMessageParcel.RewindRead(0);
176 MessageParcel reply;
177 DelayedSingleton<CoreService>::GetInstance()->OnGetNrSsbIdInfo(dataMessageParcel, reply);
178 }
179
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)180 void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
181 {
182 if (data == nullptr || size == 0) {
183 return;
184 }
185
186 GetOpKey(data, size);
187 GetOpKeyExt(data, size);
188 GetOpName(data, size);
189 SendCallSetupRequestResult(data, size);
190 HasOperatorPrivileges(data, size);
191 GetCellInfoList(data, size);
192 UpdateIccDiallingNumbers(data, size);
193 GetNrSsbIdInfoTesting(data, size);
194 auto telRilManager = DelayedSingleton<CoreService>::GetInstance()->telRilManager_;
195 if (telRilManager == nullptr || telRilManager->handler_ == nullptr) {
196 return;
197 }
198 auto handler = telRilManager->handler_;
199 if (handler != nullptr) {
200 handler->RemoveAllEvents();
201 handler->SendEvent(0, 0, AppExecFwk::EventQueue::Priority::HIGH);
202 sleep(SLEEP_TIME_SECONDS);
203 }
204 telRilManager->handler_->ClearFfrt(false);
205 telRilManager->handler_->queue_ = nullptr;
206 return;
207 }
208 } // namespace OHOS
209
210 /* Fuzzer entry point */
LLVMFuzzerInitialize(int * argc,char *** argv)211 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
212 {
213 OHOS::AddCoreServiceTokenFuzzer token;
214 return 0;
215 }
216
217 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)218 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
219 {
220 /* Run your code on data */
221 OHOS::DoSomethingInterestingWithMyAPI(data, size);
222 OHOS::DelayedSingleton<CoreService>::DestroyInstance();
223 return 0;
224 }
225