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