• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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