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