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 "bluetoothdialcall_fuzzer.h" 17 18#include <cstddef> 19#include <cstdint> 20#define private public 21#include "addcalltoken_fuzzer.h" 22#include "bluetooth_call_service.h" 23#include "message_parcel.h" 24 25using namespace OHOS::Telephony; 26namespace OHOS { 27constexpr int32_t SLOT_NUM = 3; 28 29void AnswerCall(const uint8_t *data, size_t size) 30{ 31 if (!IsServiceInited()) { 32 return; 33 } 34 35 MessageParcel dataParcel; 36 dataParcel.WriteBuffer(data, size); 37 dataParcel.RewindRead(0); 38 MessageParcel reply; 39 DelayedSingleton<BluetoothCallService>::GetInstance()->OnAnswerCall(dataParcel, reply); 40} 41 42void RejectCall(const uint8_t *data, size_t size) 43{ 44 if (!IsServiceInited()) { 45 return; 46 } 47 48 MessageParcel dataParcel; 49 dataParcel.WriteBuffer(data, size); 50 dataParcel.RewindRead(0); 51 MessageParcel reply; 52 DelayedSingleton<BluetoothCallService>::GetInstance()->OnRejectCall(dataParcel, reply); 53} 54 55void HangUpCall(const uint8_t *data, size_t size) 56{ 57 if (!IsServiceInited()) { 58 return; 59 } 60 61 MessageParcel dataParcel; 62 dataParcel.WriteBuffer(data, size); 63 dataParcel.RewindRead(0); 64 MessageParcel reply; 65 DelayedSingleton<BluetoothCallService>::GetInstance()->OnHangUpCall(dataParcel, reply); 66} 67 68void GetBtCallState(const uint8_t *data, size_t size) 69{ 70 if (!IsServiceInited()) { 71 return; 72 } 73 74 MessageParcel dataParcel; 75 dataParcel.WriteBuffer(data, size); 76 dataParcel.RewindRead(0); 77 MessageParcel reply; 78 DelayedSingleton<BluetoothCallService>::GetInstance()->OnGetBtCallState(dataParcel, reply); 79} 80 81void HoldCall(const uint8_t *data, size_t size) 82{ 83 if (!IsServiceInited()) { 84 return; 85 } 86 87 MessageParcel dataParcel; 88 dataParcel.WriteBuffer(data, size); 89 dataParcel.RewindRead(0); 90 MessageParcel reply; 91 DelayedSingleton<BluetoothCallService>::GetInstance()->OnHoldCall(dataParcel, reply); 92} 93 94void UnHoldCall(const uint8_t *data, size_t size) 95{ 96 if (!IsServiceInited()) { 97 return; 98 } 99 100 MessageParcel dataParcel; 101 dataParcel.WriteBuffer(data, size); 102 dataParcel.RewindRead(0); 103 MessageParcel reply; 104 DelayedSingleton<BluetoothCallService>::GetInstance()->OnUnHoldCall(dataParcel, reply); 105} 106 107void SwitchCall(const uint8_t *data, size_t size) 108{ 109 if (!IsServiceInited()) { 110 return; 111 } 112 113 MessageParcel dataParcel; 114 dataParcel.WriteBuffer(data, size); 115 dataParcel.RewindRead(0); 116 MessageParcel reply; 117 DelayedSingleton<BluetoothCallService>::GetInstance()->OnSwitchCall(dataParcel, reply); 118} 119 120void CombineConference(const uint8_t *data, size_t size) 121{ 122 if (!IsServiceInited()) { 123 return; 124 } 125 126 MessageParcel dataParcel; 127 dataParcel.WriteBuffer(data, size); 128 dataParcel.RewindRead(0); 129 MessageParcel reply; 130 DelayedSingleton<BluetoothCallService>::GetInstance()->OnCombineConference(dataParcel, reply); 131} 132 133void SeparateConference(const uint8_t *data, size_t size) 134{ 135 if (!IsServiceInited()) { 136 return; 137 } 138 139 MessageParcel dataParcel; 140 dataParcel.WriteBuffer(data, size); 141 dataParcel.RewindRead(0); 142 MessageParcel reply; 143 DelayedSingleton<BluetoothCallService>::GetInstance()->OnSeparateConference(dataParcel, reply); 144} 145 146void KickOutFromConference(const uint8_t *data, size_t size) 147{ 148 if (!IsServiceInited()) { 149 return; 150 } 151 152 MessageParcel dataParcel; 153 dataParcel.WriteBuffer(data, size); 154 dataParcel.RewindRead(0); 155 MessageParcel reply; 156 DelayedSingleton<BluetoothCallService>::GetInstance()->OnKickOutFromConference(dataParcel, reply); 157} 158 159void StartDtmf(const uint8_t *data, size_t size) 160{ 161 if (!IsServiceInited()) { 162 return; 163 } 164 165 MessageParcel dataParcel; 166 dataParcel.WriteInt8(*data); 167 dataParcel.WriteBuffer(data, size); 168 dataParcel.RewindRead(0); 169 MessageParcel reply; 170 DelayedSingleton<BluetoothCallService>::GetInstance()->OnStartDtmf(dataParcel, reply); 171} 172 173void StopDtmf(const uint8_t *data, size_t size) 174{ 175 if (!IsServiceInited()) { 176 return; 177 } 178 179 MessageParcel dataParcel; 180 dataParcel.WriteBuffer(data, size); 181 dataParcel.RewindRead(0); 182 MessageParcel reply; 183 DelayedSingleton<BluetoothCallService>::GetInstance()->OnStopDtmf(dataParcel, reply); 184} 185 186void GetCurrentCallList(const uint8_t *data, size_t size) 187{ 188 if (!IsServiceInited()) { 189 return; 190 } 191 192 int32_t slotId = static_cast<int32_t>(size % SLOT_NUM); 193 MessageParcel dataParcel; 194 dataParcel.WriteInt32(slotId); 195 dataParcel.WriteBuffer(data, size); 196 dataParcel.RewindRead(0); 197 MessageParcel reply; 198 DelayedSingleton<BluetoothCallService>::GetInstance()->OnGetCurrentCallList(dataParcel, reply); 199} 200 201void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size) 202{ 203 if (data == nullptr || size == 0) { 204 return; 205 } 206 207 AnswerCall(data, size); 208 RejectCall(data, size); 209 HangUpCall(data, size); 210 GetBtCallState(data, size); 211 HoldCall(data, size); 212 UnHoldCall(data, size); 213 SwitchCall(data, size); 214 CombineConference(data, size); 215 SeparateConference(data, size); 216 KickOutFromConference(data, size); 217 StartDtmf(data, size); 218 StopDtmf(data, size); 219 GetCurrentCallList(data, size); 220} 221} // namespace OHOS 222 223/* Fuzzer entry point */ 224extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 225{ 226 OHOS::AddCallTokenFuzzer token; 227 /* Run your code on data */ 228 OHOS::DoSomethingInterestingWithMyAPI(data, size); 229 return 0; 230} 231