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