• 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     "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