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