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 "getcscalldata_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20 #define private public
21 #include "addcellularcalltoken_fuzzer.h"
22 #include "cellular_call_handler.h"
23 #include "cellular_call_service.h"
24 #include "hril_call_parcel.h"
25 #include "radio_event.h"
26 #include "securec.h"
27 #include "system_ability_definition.h"
28
29 using namespace OHOS::Telephony;
30 namespace OHOS {
31 static bool g_isInited = false;
32 constexpr int32_t SLOT_NUM = 2;
33 constexpr int32_t STATE_NUM = 9;
34
IsServiceInited()35 bool IsServiceInited()
36 {
37 DelayedSingleton<CellularCallService>::GetInstance()->OnStart();
38 if (!g_isInited && (static_cast<int32_t>(DelayedSingleton<CellularCallService>::GetInstance()->state_) ==
39 static_cast<int32_t>(ServiceRunningState::STATE_RUNNING))) {
40 g_isInited = true;
41 }
42 return g_isInited;
43 }
44
GetCsCallData(std::shared_ptr<CellularCallHandler> handle,AppExecFwk::InnerEvent::Pointer event,const uint8_t * data,size_t size)45 void GetCsCallData(std::shared_ptr<CellularCallHandler> handle, AppExecFwk::InnerEvent::Pointer event,
46 const uint8_t *data, size_t size)
47 {
48 if (!IsServiceInited()) {
49 return;
50 }
51
52 std::string number(reinterpret_cast<const char *>(data), size);
53 CallInfo info;
54 CallInfoList infoList;
55 info.number = number;
56 infoList.calls.push_back(info);
57 int32_t state = static_cast<int32_t>(size % STATE_NUM);
58 int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
59
60 handle->GetCsCallData(event);
61 handle->GetImsCallData(event);
62 handle->GetSatelliteCallData(event);
63 handle->ImsCallStatusInfoReport(event);
64 handle->SatelliteCallStatusInfoReport(event);
65 handle->CellularCallIncomingStartTrace(state);
66 handle->GetCsCallsDataResponse(event);
67 handle->GetImsCallsDataResponse(event);
68 handle->GetSatelliteCallsDataResponse(event);
69 handle->DialResponse(event);
70 handle->DialSatelliteResponse(event);
71 handle->SendDtmfResponse(event);
72 handle->StartDtmfResponse(event);
73 handle->SimStateChangeReport(event);
74 handle->SimRecordsLoadedReport(event);
75 handle->StopDtmfResponse(event);
76 handle->SetSlotId(slotId);
77 handle->GetSlotId();
78 handle->CurrentTimeMillis();
79 handle->GetCsCallsDataRequest(event);
80 handle->GetImsCallsDataRequest(event);
81 handle->GetSatelliteCallsDataRequest(event);
82 handle->ReportCsCallsData(infoList);
83 }
84
RegisterHandler(std::shared_ptr<CellularCallHandler> handle,AppExecFwk::InnerEvent::Pointer event,const uint8_t * data,size_t size)85 void RegisterHandler(std::shared_ptr<CellularCallHandler> handle, AppExecFwk::InnerEvent::Pointer event,
86 const uint8_t *data, size_t size)
87 {
88 if (!IsServiceInited()) {
89 return;
90 }
91
92 std::string number(reinterpret_cast<const char *>(data), size);
93 ImsCurrentCall info;
94 ImsCurrentCallList infoList;
95 info.number = number;
96 infoList.calls.push_back(info);
97
98 SatelliteCurrentCall satelliteInfo;
99 SatelliteCurrentCallList satelliteInfoList;
100 satelliteInfo.number = number;
101 satelliteInfoList.calls.push_back(satelliteInfo);
102
103 handle->RegisterHandler(event);
104 handle->SetDomainPreferenceModeResponse(event);
105 handle->GetDomainPreferenceModeResponse(event);
106 handle->SetImsSwitchStatusResponse(event);
107 handle->GetImsSwitchStatusResponse(event);
108 handle->UssdNotifyResponse(event);
109 handle->SetMuteResponse(event);
110 handle->GetMuteResponse(event);
111 handle->GetEmergencyCallListResponse(event);
112 handle->SetEmergencyCallListResponse(event);
113 handle->CallRingBackVoiceResponse(event);
114 handle->GetCallFailReasonResponse(event);
115 handle->UpdateSrvccStateReport(event);
116 handle->ReportEccChanged(event);
117 handle->SrvccStateCompleted();
118 handle->GetMMIResponse(event);
119 handle->GetCallWaitingResponse(event);
120 handle->GetClirResponse(event);
121 handle->ReportImsCallsData(infoList);
122 handle->ReportSatelliteCallsData(satelliteInfoList);
123 handle->SetClirResponse(event);
124 handle->GetClipResponse(event);
125 handle->SetCallTransferInfoResponse(event);
126 handle->GetCallRestrictionResponse(event);
127 handle->SetCallRestrictionResponse(event);
128 handle->SetBarringPasswordResponse(event);
129 handle->SendUssdResponse(event);
130 handle->SendUnlockPinPukResponse(event);
131 handle->HandleOperatorConfigChanged(event);
132 handle->UpdateRsrvccStateReport(event);
133 handle->SetVoNRSwitchStatusResponse(event);
134 }
135
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)136 void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
137 {
138 if (data == nullptr || size == 0) {
139 return;
140 }
141
142 if (!IsServiceInited()) {
143 return;
144 }
145
146 int32_t slotId = static_cast<int32_t>(size % SLOT_NUM);
147 RadioEvent radioEvent = static_cast<RadioEvent>(size);
148 std::shared_ptr<CellularCallHandler> handle =
149 DelayedSingleton<CellularCallService>::GetInstance()->GetHandler(slotId);
150 if (handle == nullptr) {
151 return;
152 }
153 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(radioEvent);
154 GetCsCallData(handle, std::move(event), data, size);
155 event = AppExecFwk::InnerEvent::Get(radioEvent);
156 RegisterHandler(handle, std::move(event), data, size);
157 }
158 } // namespace OHOS
159
160 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)161 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
162 {
163 OHOS::AddCellularCallTokenFuzzer token;
164 /* Run your code on data */
165 OHOS::DoSomethingInterestingWithMyAPI(data, size);
166 return 0;
167 }
168