1 /*
2 * Copyright (c) 2024 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 #include <chrono>
16 #include <thread>
17 #include <fstream>
18
19 #include "audio_effect.h"
20 #include "audio_utils.h"
21 #include "audio_effect_log.h"
22 #include "audio_effect_chain_manager.h"
23 #include "audio_errors.h"
24
25 namespace OHOS {
26 namespace AudioStandard {
27 using namespace std;
28 constexpr uint32_t INFOCHANNELS = 2;
29 constexpr uint64_t INFOCHANNELLAYOUT = 0x3;
30 const string SCENETYPEDEFAULT = "SCENE_MOVIE";
31 const string SCENETYPEMUSIC = "SCENE_MUSIC";
32 static const uint8_t* RAW_DATA = nullptr;
33 static size_t g_dataSize = 0;
34 static size_t g_pos;
35 const size_t THRESHOLD = 10;
36
37 vector<EffectChain> DEFAULT_EFFECT_CHAINS = {{"EFFECTCHAIN_SPK_MUSIC", {}, ""}, {"EFFECTCHAIN_BT_MUSIC", {}, ""}};
38 EffectChainManagerParam DEFAULT_MAP{
39 3,
40 "SCENE_DEFAULT",
41 {},
42 {{"SCENE_MOVIE_&_EFFECT_DEFAULT_&_DEVICE_TYPE_SPEAKER", "EFFECTCHAIN_SPK_MUSIC"},
43 {"SCENE_MOVIE_&_EFFECT_DEFAULT_&_DEVICE_TYPE_BLUETOOTH_A2DP", "EFFECTCHAIN_BT_MUSIC"}},
44 {{"effect1", "property1"}, {"effect4", "property5"}, {"effect1", "property4"}}
45 };
46
47 vector<shared_ptr<AudioEffectLibEntry>> DEFAULT_EFFECT_LIBRARY_LIST = {};
48 SessionEffectInfo DEFAULT_INFO = {
49 "EFFECT_DEFAULT",
50 SCENETYPEDEFAULT,
51 INFOCHANNELS,
52 INFOCHANNELLAYOUT,
53 "0",
54 };
55
56 /*
57 * describe: get data from outside untrusted data(RAW_DATA) which size is according to sizeof(T)
58 * tips: only support basic type
59 */
60 template<class T>
GetData()61 T GetData()
62 {
63 T object {};
64 size_t objectSize = sizeof(object);
65 if (RAW_DATA == nullptr || objectSize > g_dataSize - g_pos) {
66 return object;
67 }
68 errno_t ret = memcpy_s(&object, objectSize, RAW_DATA + g_pos, objectSize);
69 if (ret != EOK) {
70 return {};
71 }
72 g_pos += objectSize;
73 return object;
74 }
75
76 template<class T>
GetArrLength(T & arr)77 uint32_t GetArrLength(T& arr)
78 {
79 if (arr == nullptr) {
80 AUDIO_INFO_LOG("%{public}s: The array length is equal to 0", __func__);
81 return 0;
82 }
83 return sizeof(arr) / sizeof(arr[0]);
84 }
85
InitAudioEffectChainManagerFuzzTest()86 void InitAudioEffectChainManagerFuzzTest()
87 {
88 string effectMode = "EFFECT_DEFAULT";
89 string sceneType = "SCENE_MOVIE";
90 AudioEffectScene currSceneType = GetData<AudioEffectScene>();
91 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
92 DEFAULT_EFFECT_LIBRARY_LIST);
93 AudioEffectChainManager::GetInstance()->CreateAudioEffectChainDynamic(sceneType);
94 AudioEffectChainManager::GetInstance()->ExistAudioEffectChain(sceneType, effectMode);
95 AudioEffectChainManager::GetInstance()->SetHdiParam(currSceneType);
96 AudioEffectChainManager::GetInstance()->ResetInfo();
97 }
98
CheckAndAddSessionIDFuzzTest()99 void CheckAndAddSessionIDFuzzTest()
100 {
101 std::string sessionID = "123456";
102 AudioEffectChainManager::GetInstance()->CheckAndAddSessionID(sessionID);
103 AudioEffectChainManager::GetInstance()->CheckAndRemoveSessionID(sessionID);
104 AudioEffectChainManager::GetInstance()->ResetInfo();
105 }
106
CheckAndRemoveSessionIDFuzzTest()107 void CheckAndRemoveSessionIDFuzzTest()
108 {
109 const std::string sessionID = "123456";
110 AudioEffectChainManager::GetInstance()->CheckAndRemoveSessionID(sessionID);
111 AudioEffectChainManager::GetInstance()->ResetInfo();
112 }
113
ReleaseAudioEffectChainDynamicFuzzTest()114 void ReleaseAudioEffectChainDynamicFuzzTest()
115 {
116 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
117 DEFAULT_EFFECT_LIBRARY_LIST);
118 const std::string sceneType = "SCENE_MOVIE";
119 AudioEffectChainManager::GetInstance()->CreateAudioEffectChainDynamic(sceneType);
120 AudioEffectChainManager::GetInstance()->ReleaseAudioEffectChainDynamic(sceneType);
121 AudioEffectChainManager::GetInstance()->ResetInfo();
122 }
123
ApplyAudioEffectChainFuzzTest()124 void ApplyAudioEffectChainFuzzTest()
125 {
126 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
127 DEFAULT_EFFECT_LIBRARY_LIST);
128 int numChans = GetData<int>();
129 int frameLen = GetData<int>();
130 float* bufIn = GetData<float*>();
131 float* bufOut = GetData<float*>();
132 uint32_t outChannels = INFOCHANNELS;
133 uint64_t outChannelLayout = INFOCHANNELLAYOUT;
134 const std::string sceneType = "SCENE_MOVIE";
135 AudioEffectChainManager::GetInstance()->CreateAudioEffectChainDynamic(sceneType);
136 AudioEffectChainManager::GetInstance()->ResetInfo();
137 }
138
SetOutputDeviceSinkFuzzTest()139 void SetOutputDeviceSinkFuzzTest()
140 {
141 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
142 DEFAULT_EFFECT_LIBRARY_LIST);
143 int32_t device = GetData<int32_t>();
144 const std::string sinkName = "123456";
145 AudioEffectChainManager::GetInstance()->SetOutputDeviceSink(device, sinkName);
146 AudioEffectChainManager::GetInstance()->ResetInfo();
147 }
148
GetDeviceSinkNameFuzzTest()149 void GetDeviceSinkNameFuzzTest()
150 {
151 AudioEffectChainManager::GetInstance()->GetDeviceTypeName();
152 AudioEffectChainManager::GetInstance()->ResetInfo();
153 }
154
GetOffloadEnabledFuzzTest()155 void GetOffloadEnabledFuzzTest()
156 {
157 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
158 DEFAULT_EFFECT_LIBRARY_LIST);
159 AudioEffectChainManager::GetInstance()->deviceType_ = DEVICE_TYPE_SPEAKER;
160
161 AudioEffectChainManager::GetInstance()->spkOffloadEnabled_ = false;
162 AudioEffectChainManager::GetInstance()->SetSpkOffloadState();
163 AudioEffectChainManager::GetInstance()->GetOffloadEnabled();
164 AudioEffectChainManager::GetInstance()->ResetInfo();
165 }
166
UpdateMultichannelConfigFuzzTest()167 void UpdateMultichannelConfigFuzzTest()
168 {
169 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
170 DEFAULT_EFFECT_LIBRARY_LIST);
171 AudioEffectChainManager::GetInstance()->CreateAudioEffectChainDynamic(SCENETYPEDEFAULT);
172 const std::string sceneType = "SCENE_MOVIE";
173 AudioEffectChainManager::GetInstance()->UpdateMultichannelConfig(sceneType);
174 AudioEffectChainManager::GetInstance()->ResetInfo();
175 }
176
UpdateSpatializationStateFuzzTest()177 void UpdateSpatializationStateFuzzTest()
178 {
179 bool spatializationEnabled = GetData<bool>();
180 bool headTrackingEnabled = GetData<bool>();
181
182 AudioSpatializationState spatializationState = {spatializationEnabled, headTrackingEnabled};
183
184 AudioEffectChainManager::GetInstance()->UpdateSpatializationState(spatializationState);
185 AudioEffectChainManager::GetInstance()->ResetInfo();
186 }
187
SetHdiParamFuzzTest()188 void SetHdiParamFuzzTest()
189 {
190 AudioEffectScene currSceneType = GetData<AudioEffectScene>();
191 AudioEffectChainManager::GetInstance()->SetHdiParam(currSceneType);
192 AudioEffectChainManager::GetInstance()->ResetInfo();
193 }
194
SessionInfoMapAddFuzzTest()195 void SessionInfoMapAddFuzzTest()
196 {
197 const std::string sessionID = "123456";
198 AudioEffectChainManager::GetInstance()->SessionInfoMapAdd(sessionID, DEFAULT_INFO);
199 AudioEffectChainManager::GetInstance()->SessionInfoMapDelete(SCENETYPEDEFAULT, sessionID);
200 AudioEffectChainManager::GetInstance()->ResetInfo();
201 }
202
SessionInfoMapDeleteFuzzTest()203 void SessionInfoMapDeleteFuzzTest()
204 {
205 const std::string sessionID = "123456";
206 AudioEffectChainManager::GetInstance()->SessionInfoMapDelete(SCENETYPEDEFAULT, sessionID);
207 AudioEffectChainManager::GetInstance()->ResetInfo();
208 }
209
ReturnEffectChannelInfoFuzzTest()210 void ReturnEffectChannelInfoFuzzTest()
211 {
212 uint32_t channels = GetData<uint32_t>();
213 uint64_t channelLayout = GetData<uint64_t>();
214 const std::string sessionID = "123456";
215
216 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
217 DEFAULT_EFFECT_LIBRARY_LIST);
218 AudioEffectChainManager::GetInstance()->CreateAudioEffectChainDynamic(SCENETYPEDEFAULT);
219 AudioEffectChainManager::GetInstance()->SessionInfoMapAdd(sessionID, DEFAULT_INFO);
220
221 AudioEffectChainManager::GetInstance()->ReturnEffectChannelInfo(SCENETYPEDEFAULT, channels,
222 channelLayout);
223
224 AudioEffectChainManager::GetInstance()->ResetInfo();
225 }
226
ReturnMultiChannelInfoFuzzTest()227 void ReturnMultiChannelInfoFuzzTest()
228 {
229 uint32_t channels = GetData<uint32_t>();
230 uint64_t channelLayout = GetData<uint64_t>();
231 const std::string sessionID = "123456";
232
233 AudioEffectChainManager::GetInstance()->SessionInfoMapAdd(sessionID, DEFAULT_INFO);
234 AudioEffectChainManager::GetInstance()->ReturnMultiChannelInfo(&channels, &channelLayout);
235 AudioEffectChainManager::GetInstance()->ResetInfo();
236 }
237
EffectRotationUpdateFuzzTest()238 void EffectRotationUpdateFuzzTest()
239 {
240 uint32_t rotationState = GetData<uint32_t>();
241 AudioEffectChainManager::GetInstance()->EffectRotationUpdate(rotationState);
242 AudioEffectChainManager::GetInstance()->ResetInfo();
243 }
244
GetLatencyFuzzTest()245 void GetLatencyFuzzTest()
246 {
247 const std::string sessionID = "123456";
248 AudioEffectChainManager::GetInstance()->SessionInfoMapAdd(sessionID, DEFAULT_INFO);
249 AudioEffectChainManager::GetInstance()->GetLatency(sessionID);
250 AudioEffectChainManager::GetInstance()->ResetInfo();
251 }
252
SetSpatializationSceneTypeFuzzTest()253 void SetSpatializationSceneTypeFuzzTest()
254 {
255 AudioSpatializationSceneType spatializationSceneType = GetData<AudioSpatializationSceneType>();
256
257 AudioEffectChainManager::GetInstance()->SetSpatializationSceneType(spatializationSceneType);
258 AudioEffectChainManager::GetInstance()->ResetInfo();
259 }
260
UpdateSpkOffloadEnabledFuzzTest()261 void UpdateSpkOffloadEnabledFuzzTest()
262 {
263 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
264 DEFAULT_EFFECT_LIBRARY_LIST);
265 bool spkOffloadEnabled = GetData<bool>();
266 AudioEffectChainManager::GetInstance()->spkOffloadEnabled_ = spkOffloadEnabled;
267 AudioEffectChainManager::GetInstance()->UpdateDefaultAudioEffect();
268 AudioEffectChainManager::GetInstance()->deviceType_ = DEVICE_TYPE_SPEAKER;
269 AudioEffectChainManager::GetInstance()->GetOffloadEnabled();
270 AudioEffectChainManager::GetInstance()->ResetInfo();
271 }
272
UpdateDeviceInfoFuzzTest()273 void UpdateDeviceInfoFuzzTest()
274 {
275 int32_t device = GetData<int32_t>();
276 string sinkName = "Speaker";
277
278 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
279 DEFAULT_EFFECT_LIBRARY_LIST);
280 bool isInitialized = GetData<bool>();
281 AudioEffectChainManager::GetInstance()->isInitialized_ = isInitialized;
282 AudioEffectChainManager::GetInstance()->deviceType_ = DEVICE_TYPE_SPEAKER;
283 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
284 DEFAULT_EFFECT_LIBRARY_LIST);
285 AudioEffectChainManager::GetInstance()->UpdateDeviceInfo(device, sinkName);
286 AudioEffectChainManager::GetInstance()->ResetInfo();
287 }
288
CheckAndReleaseCommonEffectChainFuzzTest()289 void CheckAndReleaseCommonEffectChainFuzzTest()
290 {
291 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
292 DEFAULT_EFFECT_LIBRARY_LIST);
293 bool isCommonEffectChainExisted = GetData<bool>();
294 AudioEffectChainManager::GetInstance()->isDefaultEffectChainExisted_ = isCommonEffectChainExisted;
295 AudioEffectChainManager::GetInstance()->CheckAndReleaseCommonEffectChain(SCENETYPEMUSIC);
296 AudioEffectChainManager::GetInstance()->ResetInfo();
297 }
298
UpdateCurrSceneTypeFuzzTest()299 void UpdateCurrSceneTypeFuzzTest()
300 {
301 AudioEffectScene currSceneType = GetData<AudioEffectScene>();
302 bool spatializationEnabled = GetData<bool>();
303
304 std::string sceneType = SCENETYPEMUSIC;
305 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
306 DEFAULT_EFFECT_LIBRARY_LIST);
307 AudioEffectChainManager::GetInstance()->spatializationEnabled_ = spatializationEnabled;
308 AudioEffectChainManager::GetInstance()->UpdateCurrSceneType(currSceneType, sceneType);
309 AudioEffectChainManager::GetInstance()->ResetInfo();
310 }
311
CheckSceneTypeMatchFuzzTest()312 void CheckSceneTypeMatchFuzzTest()
313 {
314 const std::string sinkSceneType = SCENETYPEMUSIC;
315 const std::string sceneType = SCENETYPEMUSIC;
316
317 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
318 DEFAULT_EFFECT_LIBRARY_LIST);
319 AudioEffectChainManager::GetInstance()->CheckSceneTypeMatch(sinkSceneType, sceneType);
320 AudioEffectChainManager::GetInstance()->ResetInfo();
321 }
322
UpdateSpatialDeviceTypeFuzzTest()323 void UpdateSpatialDeviceTypeFuzzTest()
324 {
325 AudioSpatialDeviceType spatialDeviceType = GetData<AudioSpatialDeviceType>();
326
327 AudioEffectChainManager::GetInstance()->InitAudioEffectChainManager(DEFAULT_EFFECT_CHAINS, DEFAULT_MAP,
328 DEFAULT_EFFECT_LIBRARY_LIST);
329 AudioEffectChainManager::GetInstance()->UpdateSpatialDeviceType(spatialDeviceType);
330 AudioEffectChainManager::GetInstance()->ResetInfo();
331 }
332
333 typedef void (*TestFuncs[24])();
334
335 TestFuncs g_testFuncs = {
336 InitAudioEffectChainManagerFuzzTest,
337 CheckAndAddSessionIDFuzzTest,
338 CheckAndRemoveSessionIDFuzzTest,
339 ReleaseAudioEffectChainDynamicFuzzTest,
340 ApplyAudioEffectChainFuzzTest,
341 SetOutputDeviceSinkFuzzTest,
342 GetDeviceSinkNameFuzzTest,
343 GetOffloadEnabledFuzzTest,
344 UpdateMultichannelConfigFuzzTest,
345 UpdateSpatializationStateFuzzTest,
346 SetHdiParamFuzzTest,
347 SessionInfoMapAddFuzzTest,
348 SessionInfoMapDeleteFuzzTest,
349 ReturnEffectChannelInfoFuzzTest,
350 ReturnMultiChannelInfoFuzzTest,
351 EffectRotationUpdateFuzzTest,
352 GetLatencyFuzzTest,
353 SetSpatializationSceneTypeFuzzTest,
354 UpdateSpkOffloadEnabledFuzzTest,
355 UpdateDeviceInfoFuzzTest,
356 CheckAndReleaseCommonEffectChainFuzzTest,
357 UpdateCurrSceneTypeFuzzTest,
358 CheckSceneTypeMatchFuzzTest,
359 UpdateSpatialDeviceTypeFuzzTest
360 };
361
FuzzTest(const uint8_t * rawData,size_t size)362 bool FuzzTest(const uint8_t* rawData, size_t size)
363 {
364 if (rawData == nullptr) {
365 return false;
366 }
367
368 // initialize data
369 RAW_DATA = rawData;
370 g_dataSize = size;
371 g_pos = 0;
372
373 uint32_t code = GetData<uint32_t>();
374 uint32_t len = GetArrLength(g_testFuncs);
375 if (len > 0) {
376 g_testFuncs[code % len]();
377 } else {
378 AUDIO_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
379 }
380
381 return true;
382 }
383 } // namespace AudioStandard
384 } // namespace OHOS
385
386 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)387 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
388 {
389 if (size < OHOS::AudioStandard::THRESHOLD) {
390 return 0;
391 }
392
393 OHOS::AudioStandard::FuzzTest(data, size);
394 return 0;
395 }
396