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 <iostream>
17 #include <cstddef>
18 #include <cstdint>
19 #include <vector>
20 #include <memory>
21 #include <queue>
22 #include <string>
23 #undef private
24 #include "audio_info.h"
25 #include "simd_utils.h"
26 #include "hpae_pcm_buffer.h"
27 #include "audio_log.h"
28 using namespace std;
29 using namespace OHOS::AudioStandard::HPAE;
30
31 namespace OHOS {
32 namespace AudioStandard {
33 using namespace std;
34 static const uint8_t *RAW_DATA = nullptr;
35 static size_t g_dataSize = 0;
36 static size_t g_pos;
37 const size_t THRESHOLD = 10;
38 const size_t TESTSIZE = 1024;
39 const uint32_t TESTFRAME = 1;
40 typedef void (*TestPtr)(const uint8_t *, size_t);
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
GetPcmBufferInfoFuzzTest()68 void GetPcmBufferInfoFuzzTest()
69 {
70 PcmBufferInfo pcmBufferInfo;
71 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
72 hpaePcmBuffer->GetPcmBufferInfo();
73 }
74
GetChannelCountFuzzTest()75 void GetChannelCountFuzzTest()
76 {
77 PcmBufferInfo pcmBufferInfo;
78 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
79 hpaePcmBuffer->GetChannelCount();
80 }
81
GetFrameLenFuzzTest()82 void GetFrameLenFuzzTest()
83 {
84 PcmBufferInfo pcmBufferInfo;
85 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
86 hpaePcmBuffer->GetFrameLen();
87 }
88
GetSampleRateFuzzTest()89 void GetSampleRateFuzzTest()
90 {
91 PcmBufferInfo pcmBufferInfo;
92 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
93 hpaePcmBuffer->GetSampleRate();
94 }
95
IsValidFuzzTest()96 void IsValidFuzzTest()
97 {
98 PcmBufferInfo pcmBufferInfo;
99 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
100 hpaePcmBuffer->IsValid();
101 }
102
IsSilenceFuzzTest()103 void IsSilenceFuzzTest()
104 {
105 PcmBufferInfo pcmBufferInfo;
106 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
107 hpaePcmBuffer->IsSilence();
108 }
109
GetBufferStateFuzzTest()110 void GetBufferStateFuzzTest()
111 {
112 PcmBufferInfo pcmBufferInfo;
113 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
114 hpaePcmBuffer->GetBufferState();
115 }
116
GetChannelLayoutFuzzTest()117 void GetChannelLayoutFuzzTest()
118 {
119 PcmBufferInfo pcmBufferInfo;
120 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
121 hpaePcmBuffer->GetChannelLayout();
122 }
123
ReConfigFuzzTest()124 void ReConfigFuzzTest()
125 {
126 PcmBufferInfo pcmBufferInfo;
127 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
128 hpaePcmBuffer->ReConfig(pcmBufferInfo);
129 }
130
GetFrameDataFuzzTest1()131 void GetFrameDataFuzzTest1()
132 {
133 PcmBufferInfo pcmBufferInfo;
134 pcmBufferInfo.isMultiFrames = GetData<bool>();
135 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
136 HpaePcmBuffer frameData = HpaePcmBuffer(pcmBufferInfo);
137 hpaePcmBuffer->GetFrameData(frameData);
138 }
139
GetFrameDataFuzzTest2()140 void GetFrameDataFuzzTest2()
141 {
142 PcmBufferInfo pcmBufferInfo;
143 pcmBufferInfo.isMultiFrames = GetData<bool>();
144 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
145 std::vector<float> frameData(TESTSIZE, 0.0f);
146 hpaePcmBuffer->GetFrameData(frameData);
147 }
148
PushFrameDataFuzzTest1()149 void PushFrameDataFuzzTest1()
150 {
151 PcmBufferInfo pcmBufferInfo;
152 pcmBufferInfo.isMultiFrames = GetData<bool>();
153 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
154 HpaePcmBuffer frameData = HpaePcmBuffer(pcmBufferInfo);
155 hpaePcmBuffer->PushFrameData(frameData);
156 }
157
PushFrameDataFuzzTest2()158 void PushFrameDataFuzzTest2()
159 {
160 PcmBufferInfo pcmBufferInfo;
161 pcmBufferInfo.isMultiFrames = GetData<bool>();
162 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
163 std::vector<float> frameData(TESTSIZE, 0.0f);
164 hpaePcmBuffer->PushFrameData(frameData);
165 }
166
StoreFrameDataFuzzTest()167 void StoreFrameDataFuzzTest()
168 {
169 PcmBufferInfo pcmBufferInfo;
170 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
171 HpaePcmBuffer frameData = HpaePcmBuffer(pcmBufferInfo);
172 hpaePcmBuffer->StoreFrameData(frameData);
173 }
174
SizeFuzzTest()175 void SizeFuzzTest()
176 {
177 PcmBufferInfo pcmBufferInfo;
178 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
179 hpaePcmBuffer->Size();
180 }
181
DataSizeFuzzTest()182 void DataSizeFuzzTest()
183 {
184 PcmBufferInfo pcmBufferInfo;
185 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
186 hpaePcmBuffer->DataSize();
187 }
188
GetFramesFuzzTest()189 void GetFramesFuzzTest()
190 {
191 PcmBufferInfo pcmBufferInfo;
192 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
193 hpaePcmBuffer->GetFrames();
194 }
195
GetReadPosFuzzTest()196 void GetReadPosFuzzTest()
197 {
198 PcmBufferInfo pcmBufferInfo;
199 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
200 hpaePcmBuffer->GetReadPos();
201 }
202
GetWritePosFuzzTest()203 void GetWritePosFuzzTest()
204 {
205 PcmBufferInfo pcmBufferInfo;
206 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
207 hpaePcmBuffer->GetWritePos();
208 }
209
UpdateReadPosFuzzTest()210 void UpdateReadPosFuzzTest()
211 {
212 PcmBufferInfo pcmBufferInfo;
213 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
214 size_t readPos = hpaePcmBuffer -> GetReadPos();
215 hpaePcmBuffer->UpdateReadPos(readPos);
216 }
217
UpdateWritePosFuzzTest()218 void UpdateWritePosFuzzTest()
219 {
220 PcmBufferInfo pcmBufferInfo;
221 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
222 size_t readPos = hpaePcmBuffer -> GetReadPos();
223 hpaePcmBuffer->UpdateWritePos(readPos);
224 }
225
SetBufferValidFuzzTest()226 void SetBufferValidFuzzTest()
227 {
228 PcmBufferInfo pcmBufferInfo;
229 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
230 bool vaild = GetData<bool>();
231 hpaePcmBuffer->SetBufferValid(vaild);
232 }
233
SetBufferSilenceFuzzTest()234 void SetBufferSilenceFuzzTest()
235 {
236 PcmBufferInfo pcmBufferInfo;
237 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
238 bool silence = GetData<bool>();
239 hpaePcmBuffer->SetBufferSilence(silence);
240 }
241
SetBufferStateFuzzTest()242 void SetBufferStateFuzzTest()
243 {
244 PcmBufferInfo pcmBufferInfo;
245 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
246 uint32_t state = hpaePcmBuffer -> GetBufferState();
247 hpaePcmBuffer->SetBufferState(state);
248 }
249
GetCurFramesFuzzTest()250 void GetCurFramesFuzzTest()
251 {
252 PcmBufferInfo pcmBufferInfo;
253 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
254 hpaePcmBuffer->GetCurFrames();
255 }
256
GetPcmDataBufferFuzzTest()257 void GetPcmDataBufferFuzzTest()
258 {
259 PcmBufferInfo pcmBufferInfo;
260 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
261 hpaePcmBuffer->GetPcmDataBuffer();
262 }
263
GetFrameSampleFuzzTest()264 void GetFrameSampleFuzzTest()
265 {
266 PcmBufferInfo pcmBufferInfo;
267 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
268 hpaePcmBuffer->GetFrameSample();
269 }
270
GetSourceBufferTypeFuzzTest()271 void GetSourceBufferTypeFuzzTest()
272 {
273 PcmBufferInfo pcmBufferInfo;
274 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
275 hpaePcmBuffer->GetSourceBufferType();
276 }
277
SetSourceBufferTypeFuzzTest()278 void SetSourceBufferTypeFuzzTest()
279 {
280 PcmBufferInfo pcmBufferInfo;
281 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
282 HpaeSourceBufferType type = hpaePcmBuffer->GetSourceBufferType();
283 hpaePcmBuffer->SetSourceBufferType(type);
284 }
285
GetSplitStreamTypeFuzzTest()286 void GetSplitStreamTypeFuzzTest()
287 {
288 PcmBufferInfo pcmBufferInfo;
289 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
290 hpaePcmBuffer->GetSplitStreamType();
291 }
292
SetSplitStreamTypeFuzzTest()293 void SetSplitStreamTypeFuzzTest()
294 {
295 PcmBufferInfo pcmBufferInfo;
296 auto hpaePcmBuffer = std::make_shared<HpaePcmBuffer>(pcmBufferInfo);
297 HpaeSplitStreamType type = hpaePcmBuffer->GetSplitStreamType();
298 hpaePcmBuffer->SetSplitStreamType(type);
299 }
300
HpaePcmBufferOperator()301 void HpaePcmBufferOperator()
302 {
303 PcmBufferInfo pcmBufferInfo;
304 pcmBufferInfo.frames = TESTFRAME;
305 pcmBufferInfo.isMultiFrames = GetData<bool>();
306 HpaePcmBuffer srcHpaePcmBuffer(pcmBufferInfo);
307 HpaePcmBuffer dstHpaePcmBuffer(pcmBufferInfo);
308 std::vector<float> vec(TESTFRAME);
309 std::vector<std::vector<float>> dstVec(TESTFRAME);
310 srcHpaePcmBuffer = dstVec;
311 dstHpaePcmBuffer = vec;
312 srcHpaePcmBuffer = dstHpaePcmBuffer;
313 srcHpaePcmBuffer += dstHpaePcmBuffer;
314 srcHpaePcmBuffer -= dstHpaePcmBuffer;
315 srcHpaePcmBuffer *= dstHpaePcmBuffer;
316 }
317
318 typedef void (*TestFuncs[32])();
319
320 TestFuncs g_testFuncs = {
321 GetPcmBufferInfoFuzzTest,
322 GetChannelCountFuzzTest,
323 GetFrameLenFuzzTest,
324 GetSampleRateFuzzTest,
325 IsValidFuzzTest,
326 IsSilenceFuzzTest,
327 GetBufferStateFuzzTest,
328 GetChannelLayoutFuzzTest,
329 ReConfigFuzzTest,
330 GetFrameDataFuzzTest1,
331 GetFrameDataFuzzTest2,
332 PushFrameDataFuzzTest1,
333 PushFrameDataFuzzTest2,
334 StoreFrameDataFuzzTest,
335 SizeFuzzTest,
336 DataSizeFuzzTest,
337 GetFramesFuzzTest,
338 GetReadPosFuzzTest,
339 GetWritePosFuzzTest,
340 UpdateReadPosFuzzTest,
341 UpdateWritePosFuzzTest,
342 SetBufferValidFuzzTest,
343 SetBufferSilenceFuzzTest,
344 SetBufferStateFuzzTest,
345 GetCurFramesFuzzTest,
346 GetPcmDataBufferFuzzTest,
347 GetFrameSampleFuzzTest,
348 GetSourceBufferTypeFuzzTest,
349 SetSourceBufferTypeFuzzTest,
350 GetSplitStreamTypeFuzzTest,
351 SetSplitStreamTypeFuzzTest,
352 HpaePcmBufferOperator,
353 };
354
FuzzTest(const uint8_t * rawData,size_t size)355 bool FuzzTest(const uint8_t* rawData, size_t size)
356 {
357 if (rawData == nullptr) {
358 return false;
359 }
360
361 // initialize data
362 RAW_DATA = rawData;
363 g_dataSize = size;
364 g_pos = 0;
365
366 uint32_t code = GetData<uint32_t>();
367 uint32_t len = GetArrLength(g_testFuncs);
368 if (len > 0) {
369 g_testFuncs[code % len]();
370 } else {
371 AUDIO_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
372 }
373
374 return true;
375 }
376
377 } // namespace AudioStandard
378 } // namesapce OHOS
379
380 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)381 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
382 {
383 if (size < OHOS::AudioStandard::THRESHOLD) {
384 return 0;
385 }
386
387 OHOS::AudioStandard::FuzzTest(data, size);
388 return 0;
389 }
390