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 <cstring>
20 #include "audio_utils.h"
21 #include "audio_log.h"
22 #include "accesstoken_kit.h"
23 #include "nativetoken_kit.h"
24 #include "token_setproc.h"
25 #include "access_token.h"
26 #include "audio_channel_blend.h"
27 #include "volume_ramp.h"
28 #include "audio_speed.h"
29 #include "audio_performance_monitor.h"
30 #include "audio_performance_monitor_c.h"
31
32 namespace OHOS {
33 namespace AudioStandard {
34 using namespace std;
35
36 static const uint8_t* RAW_DATA = nullptr;
37 static size_t g_dataSize = 0;
38 static size_t g_pos;
39 const size_t THRESHOLD = 10;
40 const uint8_t TESTSIZE = 10;
41 static int32_t NUM_2 = 2;
42
43 typedef void (*TestFuncs)();
44
45 template<class T>
GetData()46 T GetData()
47 {
48 T object {};
49 size_t objectSize = sizeof(object);
50 if (g_dataSize < g_pos) {
51 return object;
52 }
53 if (RAW_DATA == nullptr || objectSize > g_dataSize - g_pos) {
54 return object;
55 }
56 errno_t ret = memcpy_s(&object, objectSize, RAW_DATA + g_pos, objectSize);
57 if (ret != EOK) {
58 return {};
59 }
60 g_pos += objectSize;
61 return object;
62 }
63
64 template<class T>
GetArrLength(T & arr)65 uint32_t GetArrLength(T& arr)
66 {
67 if (arr == nullptr) {
68 AUDIO_INFO_LOG("%{public}s: The array length is equal to 0", __func__);
69 return 0;
70 }
71 return sizeof(arr) / sizeof(arr[0]);
72 }
73
RecordSilenceStateFuzzTest()74 void RecordSilenceStateFuzzTest()
75 {
76 uint32_t sessionId = GetData<uint32_t>();
77 bool isSilence = GetData<uint8_t>() % NUM_2;
78 int32_t audioPipeTypeCount = static_cast<int32_t>(AudioPipeType::PIPE_TYPE_DIRECT_VOIP) + 1;
79 AudioPipeType pipeType = static_cast<AudioPipeType>(GetData<uint8_t>() % audioPipeTypeCount);
80 uint32_t uid = GetData<uint32_t>();
81 AudioPerformanceMonitor::GetInstance().RecordSilenceState(sessionId, isSilence, pipeType, uid);
82 }
83
DeleteSilenceMonitorFuzzTest()84 void DeleteSilenceMonitorFuzzTest()
85 {
86 uint32_t sessionId = GetData<uint32_t>();
87 AudioPerformanceMonitor::GetInstance().DeleteSilenceMonitor(sessionId);
88 }
89
ReportWriteSlowFuzzTest()90 void ReportWriteSlowFuzzTest()
91 {
92 int32_t adapterTypeCount = static_cast<int32_t>(AdapterType::ADAPTER_TYPE_MAX) + 1;
93 AdapterType adapterType = static_cast<AdapterType>(GetData<uint8_t>() % adapterTypeCount);
94 int32_t overtimeMs = GetData<int32_t>();
95 AudioPerformanceMonitor::GetInstance().ReportWriteSlow(adapterType, overtimeMs);
96 }
97
RecordTimeStampFuzzTest()98 void RecordTimeStampFuzzTest()
99 {
100 int32_t adapterTypeCount = static_cast<int32_t>(AdapterType::ADAPTER_TYPE_MAX) + 1;
101 AdapterType adapterType = static_cast<AdapterType>(GetData<uint8_t>() % adapterTypeCount);
102 AudioPerformanceMonitor::GetInstance().RecordTimeStamp(adapterType, INIT_LASTWRITTEN_TIME);
103 int64_t curTime = ClockTime::GetCurNano();
104 AudioPerformanceMonitor::GetInstance().RecordTimeStamp(adapterType, curTime);
105 int64_t exeedTime = ClockTime::GetCurNano();
106 AudioPerformanceMonitor::GetInstance().RecordTimeStamp(adapterType, exeedTime);
107 AudioPerformanceMonitor::GetInstance().DeleteOvertimeMonitor(adapterType);
108 }
109
DeleteOvertimeMonitorFuzzTest()110 void DeleteOvertimeMonitorFuzzTest()
111 {
112 int32_t adapterTypeCount = static_cast<int32_t>(AdapterType::ADAPTER_TYPE_MAX) + 1;
113 AdapterType adapterType = static_cast<AdapterType>(GetData<uint8_t>() % adapterTypeCount);
114 AudioPerformanceMonitor::GetInstance().DeleteOvertimeMonitor(adapterType);
115 }
116
DumpMonitorInfoFuzzTest()117 void DumpMonitorInfoFuzzTest()
118 {
119 std::string dumpString = "abc";
120 AudioPerformanceMonitor::GetInstance().DumpMonitorInfo(dumpString);
121 }
122
JudgeNoiseFuzzTest()123 void JudgeNoiseFuzzTest()
124 {
125 uint32_t sessionId = GetData<uint32_t>();
126 bool isSilence = GetData<uint32_t>() % NUM_2;
127 uint32_t uid = GetData<uint32_t>();
128 AudioPerformanceMonitor::GetInstance().JudgeNoise(sessionId, isSilence, uid);
129 }
130
ReportEventFuzzTest()131 void ReportEventFuzzTest()
132 {
133 int32_t detectEventCount = static_cast<int32_t>(DetectEvent::SILENCE_EVENT) + 1;
134 DetectEvent detectEvent = static_cast<DetectEvent>(GetData<uint8_t>() % detectEventCount);
135 DetectEvent reasonCode = GetData<uint8_t>() % NUM_2 == 0 ? detectEvent : GetData<DetectEvent>();
136 int32_t periodMs = GetData<int32_t>();
137 int32_t audioPipeTypeCount = static_cast<int32_t>(AudioPipeType::PIPE_TYPE_DIRECT_VOIP) + 1;
138 AudioPipeType pipeType = static_cast<AudioPipeType>(GetData<uint8_t>() % audioPipeTypeCount);
139 int32_t adapterTypeCount = static_cast<int32_t>(AdapterType::ADAPTER_TYPE_MAX) + 1;
140 AdapterType adapterType = static_cast<AdapterType>(GetData<uint8_t>() % adapterTypeCount);
141 uint32_t uid = GetData<uint32_t>();
142 AudioPerformanceMonitor::GetInstance().ReportEvent(reasonCode, periodMs, pipeType, adapterType, uid);
143 }
144
RecordPaSilenceStateFuzzTest()145 void RecordPaSilenceStateFuzzTest()
146 {
147 uint32_t sessionId = GetData<uint32_t>();
148 bool isSilence = GetData<bool>();
149 PA_PIPE_TYPE paPipeType = GetData<PA_PIPE_TYPE>();
150 uint32_t uid = GetData<uint32_t>();
151 RecordPaSilenceState(sessionId, isSilence, paPipeType, uid);
152 }
153
StartSilenceMonitorFuzzTest()154 void StartSilenceMonitorFuzzTest()
155 {
156 uint32_t sessionId = GetData<uint32_t>();
157 uint32_t tokenId = GetData<uint32_t>();
158 AudioPerformanceMonitor::GetInstance().StartSilenceMonitor(sessionId, tokenId);
159 }
160
161 TestFuncs g_testFuncs[TESTSIZE] = {
162 RecordSilenceStateFuzzTest,
163 DeleteSilenceMonitorFuzzTest,
164 ReportWriteSlowFuzzTest,
165 RecordTimeStampFuzzTest,
166 DeleteOvertimeMonitorFuzzTest,
167 DumpMonitorInfoFuzzTest,
168 JudgeNoiseFuzzTest,
169 ReportEventFuzzTest,
170 RecordPaSilenceStateFuzzTest,
171 StartSilenceMonitorFuzzTest,
172 };
173
FuzzTest(const uint8_t * rawData,size_t size)174 void FuzzTest(const uint8_t* rawData, size_t size)
175 {
176 if (rawData == nullptr) {
177 return;
178 }
179
180 // initialize data
181 RAW_DATA = rawData;
182 g_dataSize = size;
183 g_pos = 0;
184
185 uint32_t code = GetData<uint32_t>();
186 uint32_t len = GetArrLength(g_testFuncs);
187 if (len > 0) {
188 g_testFuncs[code % len]();
189 } else {
190 AUDIO_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
191 }
192
193 return;
194 }
195 } // namespace AudioStandard
196 } // namesapce OHOS
197
198 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)199 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
200 {
201 if (size < OHOS::AudioStandard::THRESHOLD) {
202 return 0;
203 }
204
205 OHOS::AudioStandard::FuzzTest(data, size);
206 return 0;
207 }
208