1 /*
2 * Copyright (c) 2025 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 <sstream>
17 #include <iostream>
18 #include <cstddef>
19 #include <cstdint>
20 #include "audio_info.h"
21 #include "id_handler.h"
22 #include "hdi_adapter_manager.h"
23 #include "pro_audio_service_adapter_impl.h"
24 #include "audio_device_info.h"
25 #include "i_hpae_manager.h"
26 #include "audio_effect.h"
27 #include "audio_log.h"
28
29 using namespace std;
30 using namespace OHOS::AudioStandard::HPAE;
31 namespace OHOS {
32 namespace AudioStandard {
33 std::shared_ptr<ProAudioServiceAdapterImpl> impl_ = nullptr;
34 static std::string g_rootPath = "/data/";
35 static const uint8_t *RAW_DATA = nullptr;
36 static size_t g_dataSize = 0;
37 static size_t g_pos;
38 const size_t THRESHOLD = 10;
39 typedef void (*TestPtr)(const uint8_t *, size_t);
40 std::mutex lock_;
41
42 template<class T>
GetData()43 T GetData()
44 {
45 T object {};
46 size_t objectSize = sizeof(object);
47 if (RAW_DATA == nullptr || objectSize > g_dataSize - g_pos) {
48 return object;
49 }
50 errno_t ret = memcpy_s(&object, objectSize, RAW_DATA + g_pos, objectSize);
51 if (ret != EOK) {
52 return {};
53 }
54 g_pos += objectSize;
55 return object;
56 }
57
58 template<class T>
GetArrLength(T & arr)59 uint32_t GetArrLength(T &arr)
60 {
61 if (arr == nullptr) {
62 AUDIO_INFO_LOG("%{public}s: The array length is equal to 0", __func__);
63 return 0;
64 }
65 return sizeof(arr) / sizeof(arr[0]);
66 }
67
68 class AudioServiceAdapterCallbackTest : public AudioServiceAdapterCallback {
69 public:
OnAudioStreamRemoved(const uint64_t sessionID)70 void OnAudioStreamRemoved(const uint64_t sessionID) override
71 {
72 return;
73 }
OnSetVolumeDbCb()74 void OnSetVolumeDbCb() override
75 {
76 return;
77 }
78 };
79
InitSinkAudioModeInfo()80 static AudioModuleInfo InitSinkAudioModeInfo()
81 {
82 AudioModuleInfo audioModuleInfo;
83 audioModuleInfo.lib = "libmodule-hdi-sink.z.so";
84 audioModuleInfo.channels = "2";
85 audioModuleInfo.rate = "48000";
86 audioModuleInfo.name = "Speaker_File";
87 audioModuleInfo.adapterName = "file_io";
88 audioModuleInfo.className = "file_io";
89 audioModuleInfo.bufferSize = "7680";
90 audioModuleInfo.format = "s32le";
91 audioModuleInfo.fixedLatency = "1";
92 audioModuleInfo.offloadEnable = "0";
93 audioModuleInfo.networkId = "LocalDevice";
94 audioModuleInfo.fileName = g_rootPath + audioModuleInfo.adapterName + "_" + audioModuleInfo.rate + "_" +\
95 audioModuleInfo.channels + "_" + audioModuleInfo.format + ".pcm";
96 std::stringstream typeValue;
97 typeValue << static_cast<int32_t>(DEVICE_TYPE_SPEAKER);
98 audioModuleInfo.deviceType = typeValue.str();
99 return audioModuleInfo;
100 }
101
InitSourceAudioModeInfo()102 static AudioModuleInfo InitSourceAudioModeInfo()
103 {
104 AudioModuleInfo audioModuleInfo;
105 audioModuleInfo.lib = "libmodule-hdi-source.z.so";
106 audioModuleInfo.channels = "2";
107 audioModuleInfo.rate = "48000";
108 audioModuleInfo.name = "mic";
109 audioModuleInfo.adapterName = "file_io";
110 audioModuleInfo.className = "file_io";
111 audioModuleInfo.bufferSize = "3840";
112 audioModuleInfo.format = "s16le";
113 audioModuleInfo.fixedLatency = "1";
114 audioModuleInfo.offloadEnable = "0";
115 audioModuleInfo.networkId = "LocalDevice";
116 audioModuleInfo.fileName = g_rootPath + audioModuleInfo.adapterName + "_" + audioModuleInfo.rate + "_" +
117 audioModuleInfo.channels + "_" + audioModuleInfo.format + ".pcm";
118 std::stringstream typeValue;
119 typeValue << static_cast<int32_t>(DEVICE_TYPE_SPEAKER);
120 audioModuleInfo.deviceType = typeValue.str();
121 return audioModuleInfo;
122 }
123
SetUp()124 void SetUp()
125 {
126 lock_guard<mutex> lock(lock_);
127 if (impl_ != nullptr) {
128 return;
129 }
130 IdHandler::GetInstance();
131 HdiAdapterManager::GetInstance();
132 std::unique_ptr<AudioServiceAdapterCallbackTest> cb = std::make_unique<AudioServiceAdapterCallbackTest>();
133 impl_ = std::static_pointer_cast<ProAudioServiceAdapterImpl>(
134 OHOS::AudioStandard::AudioServiceAdapter::CreateAudioAdapter(std::move(cb), true));
135 impl_->Connect();
136 HPAE::IHpaeManager::GetHpaeManager().Init();
137 }
138
OpenAudioPortFuzzTest()139 void OpenAudioPortFuzzTest()
140 {
141 SetUp();
142 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
143 impl_->OpenAudioPort(moduleInfo.lib, moduleInfo);
144 }
145
CloseAudioPortFuzzTest()146 void CloseAudioPortFuzzTest()
147 {
148 SetUp();
149 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
150 int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo);
151 impl_->CloseAudioPort(portId);
152 }
153
SetDefaultSinkFuzzTest()154 void SetDefaultSinkFuzzTest()
155 {
156 SetUp();
157 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
158 impl_->SetDefaultSink(moduleInfo.name);
159 }
160
SetDefaultSourceFuzzTest()161 void SetDefaultSourceFuzzTest()
162 {
163 SetUp();
164 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
165 impl_->SetDefaultSource(moduleInfo.name);
166 }
167
SuspendAudioDeviceFuzzTest()168 void SuspendAudioDeviceFuzzTest()
169 {
170 SetUp();
171 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
172 impl_->SuspendAudioDevice(moduleInfo.name, true);
173 }
174
SetSinkMuteFuzzTest()175 void SetSinkMuteFuzzTest()
176 {
177 SetUp();
178 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
179 impl_->SetSinkMute(moduleInfo.name, true);
180 }
181
GetAllSinkInputsFuzzTest()182 void GetAllSinkInputsFuzzTest()
183 {
184 SetUp();
185 impl_->GetAllSinkInputs();
186 }
187
GetAllSourceOutputsFuzzTest()188 void GetAllSourceOutputsFuzzTest()
189 {
190 SetUp();
191 impl_->GetAllSourceOutputs();
192 }
193
DisconnectFuzzTest()194 void DisconnectFuzzTest()
195 {
196 SetUp();
197 impl_->Disconnect();
198 }
199
GetTargetSinksFuzzTest()200 void GetTargetSinksFuzzTest()
201 {
202 SetUp();
203 std::string adapterName = "adapterNameFuzzTest";
204 impl_->GetTargetSinks(adapterName);
205 }
206
GetAllSinksFuzzTest()207 void GetAllSinksFuzzTest()
208 {
209 SetUp();
210 std::string adapterName = "adapterNameFuzzTest";
211 impl_->GetAllSinks();
212 }
213
SetLocalDefaultSinkFuzzTest()214 void SetLocalDefaultSinkFuzzTest()
215 {
216 SetUp();
217 std::string name = "SinkName";
218 impl_->SetLocalDefaultSink(name);
219 }
220
MoveSinkInputByIndexOrNameFuzzTest()221 void MoveSinkInputByIndexOrNameFuzzTest()
222 {
223 SetUp();
224 uint32_t sinkInputId = GetData<uint32_t>();
225 uint32_t sinkIndex = GetData<uint32_t>();
226 std::string sinkName = "SinkInputName";
227 impl_->MoveSinkInputByIndexOrName(sinkInputId, sinkIndex, sinkName);
228 }
229
MoveSourceOutputByIndexOrNameFuzzTest()230 void MoveSourceOutputByIndexOrNameFuzzTest()
231 {
232 SetUp();
233 uint32_t sinkInputId = GetData<uint32_t>();
234 uint32_t sinkIndex = GetData<uint32_t>();
235 std::string sinkName = "SourceOutputName";
236 impl_->MoveSourceOutputByIndexOrName(sinkInputId, sinkIndex, sinkName);
237 }
238
GetAudioEffectPropertyV3FuzzTest()239 void GetAudioEffectPropertyV3FuzzTest()
240 {
241 SetUp();
242 AudioEffectPropertyArrayV3 propertyArray;
243 impl_->GetAudioEffectProperty(propertyArray);
244 }
245
GetAudioEffectPropertyFuzzTest()246 void GetAudioEffectPropertyFuzzTest()
247 {
248 SetUp();
249 AudioEffectPropertyArray propertyArray;
250 impl_->GetAudioEffectProperty(propertyArray);
251 }
252
GetAudioEnhancePropertyV3FuzzTest()253 void GetAudioEnhancePropertyV3FuzzTest()
254 {
255 SetUp();
256 AudioEffectPropertyArrayV3 propertyArray;
257 impl_->GetAudioEnhanceProperty(propertyArray);
258 }
259
GetAudioEnhancePropertyFuzzTest()260 void GetAudioEnhancePropertyFuzzTest()
261 {
262 SetUp();
263 AudioEnhancePropertyArray propertyArray;
264 impl_->GetAudioEnhanceProperty(propertyArray);
265 }
266
OnOpenAudioPortCbFuzzTest()267 void OnOpenAudioPortCbFuzzTest()
268 {
269 SetUp();
270 AudioModuleInfo moduleInfo = InitSinkAudioModeInfo();
271 int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo);
272 impl_->OnOpenAudioPortCb(portId);
273 }
274
OnCloseAudioPortCbFuzzTest()275 void OnCloseAudioPortCbFuzzTest()
276 {
277 SetUp();
278 int32_t result = GetData<int32_t>();
279 impl_->OnCloseAudioPortCb(result);
280 }
281
OnSetSinkMuteCbFuzzTest()282 void OnSetSinkMuteCbFuzzTest()
283 {
284 SetUp();
285 int32_t result = GetData<int32_t>();
286 impl_->OnSetSinkMuteCb(result);
287 }
288
OnSetSourceOutputMuteCbFuzzTest()289 void OnSetSourceOutputMuteCbFuzzTest()
290 {
291 SetUp();
292 int32_t result = GetData<int32_t>();
293 impl_->OnSetSourceOutputMuteCb(result);
294 }
295
OnGetAllSinkInputsCbFuzzTest()296 void OnGetAllSinkInputsCbFuzzTest()
297 {
298 SetUp();
299 std::vector<SinkInput> sinkInputs = impl_->GetAllSinkInputs();
300 int32_t result = GetData<int32_t>();
301 impl_->OnGetAllSinkInputsCb(result, sinkInputs);
302 }
303
OnGetAllSourceOutputsCbFuzzTest()304 void OnGetAllSourceOutputsCbFuzzTest()
305 {
306 SetUp();
307 std::vector<SourceOutput> sourceOutputs = impl_->GetAllSourceOutputs();
308 int32_t result = GetData<int32_t>();
309 impl_->OnGetAllSourceOutputsCb(result, sourceOutputs);
310 }
311
OnGetAllSinksCbFuzzTest()312 void OnGetAllSinksCbFuzzTest()
313 {
314 SetUp();
315 std::vector<SinkInfo> sinks;
316 int32_t result = GetData<int32_t>();
317 impl_->OnGetAllSinksCb(result, sinks);
318 }
319
OnMoveSinkInputByIndexOrNameCbFuzzTest()320 void OnMoveSinkInputByIndexOrNameCbFuzzTest()
321 {
322 SetUp();
323 int32_t result = GetData<int32_t>();
324 impl_->OnMoveSinkInputByIndexOrNameCb(result);
325 }
326
OnMoveSourceOutputByIndexOrNameCbFuzzTest()327 void OnMoveSourceOutputByIndexOrNameCbFuzzTest()
328 {
329 SetUp();
330 int32_t result = GetData<int32_t>();
331 impl_->OnMoveSourceOutputByIndexOrNameCb(result);
332 }
333
OnGetAudioEffectPropertyCbV3FuzzTest()334 void OnGetAudioEffectPropertyCbV3FuzzTest()
335 {
336 SetUp();
337 int32_t result = GetData<int32_t>();
338 impl_->OnGetAudioEffectPropertyCbV3(result);
339 }
340
OnGetAudioEffectPropertyCbFuzzTest()341 void OnGetAudioEffectPropertyCbFuzzTest()
342 {
343 SetUp();
344 int32_t result = GetData<int32_t>();
345 impl_->OnGetAudioEffectPropertyCb(result);
346 }
347
OnGetAudioEnhancePropertyCbV3FuzzTest()348 void OnGetAudioEnhancePropertyCbV3FuzzTest()
349 {
350 SetUp();
351 int32_t result = GetData<int32_t>();
352 impl_->OnGetAudioEnhancePropertyCbV3(result);
353 }
354
OnGetAudioEnhancePropertyCbFuzzTest()355 void OnGetAudioEnhancePropertyCbFuzzTest()
356 {
357 SetUp();
358 int32_t result = GetData<int32_t>();
359 impl_->OnGetAudioEnhancePropertyCb(result);
360 }
361
HandleSourceAudioStreamRemovedFuzzTest()362 void HandleSourceAudioStreamRemovedFuzzTest()
363 {
364 SetUp();
365 uint32_t sessionId = GetData<uint32_t>();
366 impl_->HandleSourceAudioStreamRemoved(sessionId);
367 }
368
369 typedef void (*TestFuncs[32])();
370
371 TestFuncs g_testFuncs = {
372 OpenAudioPortFuzzTest,
373 CloseAudioPortFuzzTest,
374 SetDefaultSinkFuzzTest,
375 SetDefaultSourceFuzzTest,
376 SuspendAudioDeviceFuzzTest,
377 SetSinkMuteFuzzTest,
378 GetAllSinkInputsFuzzTest,
379 GetAllSourceOutputsFuzzTest,
380 DisconnectFuzzTest,
381 GetTargetSinksFuzzTest,
382 GetAllSinksFuzzTest,
383 SetLocalDefaultSinkFuzzTest,
384 MoveSinkInputByIndexOrNameFuzzTest,
385 MoveSourceOutputByIndexOrNameFuzzTest,
386 GetAudioEffectPropertyV3FuzzTest,
387 GetAudioEffectPropertyFuzzTest,
388 GetAudioEnhancePropertyV3FuzzTest,
389 GetAudioEnhancePropertyFuzzTest,
390 OnOpenAudioPortCbFuzzTest,
391 OnCloseAudioPortCbFuzzTest,
392 OnSetSinkMuteCbFuzzTest,
393 OnSetSourceOutputMuteCbFuzzTest,
394 OnGetAllSinkInputsCbFuzzTest,
395 OnGetAllSourceOutputsCbFuzzTest,
396 OnGetAllSinksCbFuzzTest,
397 OnMoveSinkInputByIndexOrNameCbFuzzTest,
398 OnMoveSourceOutputByIndexOrNameCbFuzzTest,
399 OnGetAudioEffectPropertyCbV3FuzzTest,
400 OnGetAudioEffectPropertyCbFuzzTest,
401 OnGetAudioEnhancePropertyCbV3FuzzTest,
402 OnGetAudioEnhancePropertyCbFuzzTest,
403 HandleSourceAudioStreamRemovedFuzzTest,
404 };
405
FuzzTest(const uint8_t * rawData,size_t size)406 bool FuzzTest(const uint8_t *rawData, size_t size)
407 {
408 if (rawData == nullptr) {
409 return false;
410 }
411
412 // initialize data
413 RAW_DATA = rawData;
414 g_dataSize = size;
415 g_pos = 0;
416
417 uint32_t code = GetData<uint32_t>();
418 uint32_t len = GetArrLength(g_testFuncs);
419 if (len > 0) {
420 g_testFuncs[code % len]();
421 } else {
422 AUDIO_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
423 }
424
425 return true;
426 }
427
428 } // namespace AudioStandard
429 } // namespace OHOS
430
431 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)432 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
433 {
434 if (size < OHOS::AudioStandard::THRESHOLD) {
435 return 0;
436 }
437
438 OHOS::AudioStandard::FuzzTest(data, size);
439 return 0;
440 }
441