1 /*
2 * Copyright (c) 2024-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 "audio_log.h"
17 #include "audio_microphone_descriptor.h"
18 #include "audio_router_map.h"
19
20 using namespace std;
21
22 namespace OHOS {
23 namespace AudioStandard {
24
25 static const uint8_t* RAW_DATA = nullptr;
26 static size_t g_dataSize = 0;
27 static size_t g_pos;
28 const size_t THRESHOLD = 10;
29 const int32_t NUM_3 = 3;
30 typedef void (*TestPtr)();
31
32 const vector<DeviceType> g_testDeviceTypes = {
33 DEVICE_TYPE_NONE,
34 DEVICE_TYPE_INVALID,
35 DEVICE_TYPE_EARPIECE,
36 DEVICE_TYPE_SPEAKER,
37 DEVICE_TYPE_WIRED_HEADSET,
38 DEVICE_TYPE_WIRED_HEADPHONES,
39 DEVICE_TYPE_BLUETOOTH_SCO,
40 DEVICE_TYPE_BLUETOOTH_A2DP,
41 DEVICE_TYPE_BLUETOOTH_A2DP_IN,
42 DEVICE_TYPE_MIC,
43 DEVICE_TYPE_WAKEUP,
44 DEVICE_TYPE_USB_HEADSET,
45 DEVICE_TYPE_DP,
46 DEVICE_TYPE_REMOTE_CAST,
47 DEVICE_TYPE_USB_DEVICE,
48 DEVICE_TYPE_ACCESSORY,
49 DEVICE_TYPE_REMOTE_DAUDIO,
50 DEVICE_TYPE_HDMI,
51 DEVICE_TYPE_LINE_DIGITAL,
52 DEVICE_TYPE_NEARLINK,
53 DEVICE_TYPE_NEARLINK_IN,
54 DEVICE_TYPE_FILE_SINK,
55 DEVICE_TYPE_FILE_SOURCE,
56 DEVICE_TYPE_EXTERN_CABLE,
57 DEVICE_TYPE_DEFAULT,
58 DEVICE_TYPE_USB_ARM_HEADSET,
59 DEVICE_TYPE_MAX,
60 };
61
62 template<class T>
GetArrLength(T & arr)63 uint32_t GetArrLength(T& arr)
64 {
65 if (arr == nullptr) {
66 AUDIO_INFO_LOG("%{public}s: The array length is equal to 0", __func__);
67 return 0;
68 }
69 return sizeof(arr) / sizeof(arr[0]);
70 }
71
72 template<class T>
GetData()73 T GetData()
74 {
75 T object {};
76 size_t objectSize = sizeof(object);
77 if (g_dataSize < g_pos) {
78 return object;
79 }
80 if (RAW_DATA == nullptr || objectSize > g_dataSize - g_pos) {
81 return object;
82 }
83 errno_t ret = memcpy_s(&object, objectSize, RAW_DATA + g_pos, objectSize);
84 if (ret != EOK) {
85 return {};
86 }
87 g_pos += objectSize;
88 return object;
89 }
90
AudioMicrophoneDescriptorSetMicrophoneMuteFuzzTest()91 void AudioMicrophoneDescriptorSetMicrophoneMuteFuzzTest()
92 {
93 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
94 bool isMute = GetData<bool>();
95 audioMicrophoneDescriptor.SetMicrophoneMute(isMute);
96 }
97
AudioMicrophoneDescriptorSetMicrophoneMutePersistentFuzzTest()98 void AudioMicrophoneDescriptorSetMicrophoneMutePersistentFuzzTest()
99 {
100 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
101 bool isMute = GetData<bool>();
102 audioMicrophoneDescriptor.SetMicrophoneMutePersistent(isMute);
103 }
104
AudioMicrophoneDescriptorGetPersistentMicMuteStateFuzzTest()105 void AudioMicrophoneDescriptorGetPersistentMicMuteStateFuzzTest()
106 {
107 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
108
109 audioMicrophoneDescriptor.GetPersistentMicMuteState();
110 }
111
AudioMicrophoneDescriptorInitPersistentMicrophoneMuteStateFuzzTest()112 void AudioMicrophoneDescriptorInitPersistentMicrophoneMuteStateFuzzTest()
113 {
114 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
115 bool isMute = GetData<bool>();
116 audioMicrophoneDescriptor.isMicrophoneMutePersistent_ = GetData<bool>();
117 audioMicrophoneDescriptor.InitPersistentMicrophoneMuteState(isMute);
118 }
119
AudioMicrophoneDescriptorIsMicrophoneMuteFuzzTest()120 void AudioMicrophoneDescriptorIsMicrophoneMuteFuzzTest()
121 {
122 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
123 audioMicrophoneDescriptor.IsMicrophoneMute();
124 }
125
AudioMicrophoneDescriptorGetMicrophoneMuteTemporaryFuzzTest()126 void AudioMicrophoneDescriptorGetMicrophoneMuteTemporaryFuzzTest()
127 {
128 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
129 audioMicrophoneDescriptor.GetMicrophoneMuteTemporary();
130 audioMicrophoneDescriptor.GetMicrophoneMutePersistent();
131 }
132
AudioMicrophoneDescriptorAddAudioCapturerMicrophoneDescriptorFuzzTest()133 void AudioMicrophoneDescriptorAddAudioCapturerMicrophoneDescriptorFuzzTest()
134 {
135 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
136 if (g_testDeviceTypes.size() == 0) {
137 return;
138 }
139 DeviceType devType = g_testDeviceTypes[GetData<uint32_t>() % g_testDeviceTypes.size()];
140 int32_t sessionId = GetData<int32_t>();
141 sptr<MicrophoneDescriptor> microphoneDescriptor = new MicrophoneDescriptor();
142 audioMicrophoneDescriptor.connectedMicrophones_.push_back(microphoneDescriptor);
143 audioMicrophoneDescriptor.AddAudioCapturerMicrophoneDescriptor(sessionId, devType);
144 }
145
AudioMicrophoneDescriptorGetAudioCapturerMicrophoneDescriptorsFuzzTest()146 void AudioMicrophoneDescriptorGetAudioCapturerMicrophoneDescriptorsFuzzTest()
147 {
148 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
149 int32_t sessionId = GetData<int32_t>();
150 sptr<MicrophoneDescriptor> microphoneDescriptor = new MicrophoneDescriptor();
151 audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.clear();
152 audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.insert({sessionId, microphoneDescriptor});
153 audioMicrophoneDescriptor.GetAudioCapturerMicrophoneDescriptors(sessionId);
154 }
155
AudioMicrophoneDescriptorUpdateAudioCapturerMicrophoneDescriptorFuzzTest()156 void AudioMicrophoneDescriptorUpdateAudioCapturerMicrophoneDescriptorFuzzTest()
157 {
158 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
159 if (g_testDeviceTypes.size() == 0) {
160 return;
161 }
162 DeviceType devType = g_testDeviceTypes[GetData<uint32_t>() % g_testDeviceTypes.size()];
163 sptr<MicrophoneDescriptor> microphoneDescriptor = new MicrophoneDescriptor();
164 audioMicrophoneDescriptor.connectedMicrophones_.push_back(microphoneDescriptor);
165 microphoneDescriptor->deviceType_ = devType;
166 int32_t sessionId = GetData<int32_t>();
167 audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.clear();
168 audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.insert({sessionId, microphoneDescriptor});
169 audioMicrophoneDescriptor.UpdateAudioCapturerMicrophoneDescriptor(devType);
170 audioMicrophoneDescriptor.GetAvailableMicrophones();
171 }
172
AudioMicrophoneDescriptorRemoveAudioCapturerMicrophoneDescriptorFuzzTest()173 void AudioMicrophoneDescriptorRemoveAudioCapturerMicrophoneDescriptorFuzzTest()
174 {
175 AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
176 int32_t uid = GetData<int32_t>();
177 audioMicrophoneDescriptor.RemoveAudioCapturerMicrophoneDescriptor(uid);
178 }
179
AudioRouteMapGetDeviceInfoByUidAndPidFuzzTest()180 void AudioRouteMapGetDeviceInfoByUidAndPidFuzzTest()
181 {
182 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
183 int32_t uid = GetData<int32_t>();
184 int32_t pid = GetData<int32_t>();
185 uint32_t index = GetData<uint32_t>() % NUM_3;
186 audioRouteMap.routerMap_.clear();
187 if (index == 0) {
188 audioRouteMap.routerMap_.insert({uid, {"testNetworkId", pid}});
189 } else if (index == 1) {
190 audioRouteMap.routerMap_.insert({uid, {"testNetworkId", -1}});
191 } else {
192 audioRouteMap.routerMap_.insert({uid, {"testNetworkId", GetData<int32_t>()}});
193 }
194 audioRouteMap.GetDeviceInfoByUidAndPid(uid, pid);
195 }
196
AudioRouteMapDelRouteMapInfoByKeyFuzzTest()197 void AudioRouteMapDelRouteMapInfoByKeyFuzzTest()
198 {
199 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
200 int32_t uid = GetData<int32_t>();
201 audioRouteMap.routerMap_.clear();
202 audioRouteMap.routerMap_.insert({uid, {"testNetworkId", GetData<int32_t>()}});
203
204 audioRouteMap.DelRouteMapInfoByKey(uid);
205 }
206
AudioRouteMapAddRouteMapInfoFuzzTest()207 void AudioRouteMapAddRouteMapInfoFuzzTest()
208 {
209 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
210 int32_t uid = GetData<int32_t>();
211 int32_t pid = GetData<int32_t>();
212 std::string device = "testDevice";
213
214 audioRouteMap.AddRouteMapInfo(uid, device, pid);
215 }
216
AudioRouteMapAddFastRouteMapInfoFuzzTest()217 void AudioRouteMapAddFastRouteMapInfoFuzzTest()
218 {
219 static const vector<DeviceRole> testDeviceRoles = {
220 DEVICE_ROLE_NONE,
221 INPUT_DEVICE,
222 OUTPUT_DEVICE,
223 DEVICE_ROLE_MAX,
224 };
225 if (testDeviceRoles.size() == 0) {
226 return;
227 }
228 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
229 int32_t uid = GetData<int32_t>();
230 std::string device = "testDevice";
231 DeviceRole role = testDeviceRoles[GetData<uint32_t>() % testDeviceRoles.size()];
232
233 audioRouteMap.AddFastRouteMapInfo(uid, device, role);
234 }
235
AudioRouteMapRemoveDeviceInRouterMapFuzzTest()236 void AudioRouteMapRemoveDeviceInRouterMapFuzzTest()
237 {
238 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
239 audioRouteMap.routerMap_.clear();
240 int32_t uid = GetData<int32_t>();
241 std::string networkId = "testNetworkId";
242 audioRouteMap.routerMap_.insert({uid, {"testNetworkId1", GetData<int32_t>()}});
243 audioRouteMap.routerMap_.insert({uid + 1, {"testNetworkId", GetData<int32_t>()}});
244
245 audioRouteMap.RemoveDeviceInRouterMap(networkId);
246 }
247
AudioRouteMapRemoveDeviceInFastRouterMapFuzzTest()248 void AudioRouteMapRemoveDeviceInFastRouterMapFuzzTest()
249 {
250 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
251 audioRouteMap.fastRouterMap_.clear();
252 int32_t uid = GetData<int32_t>();
253 std::string networkId = "testNetworkId";
254 audioRouteMap.fastRouterMap_.insert({uid, {networkId, DEVICE_ROLE_NONE}});
255 audioRouteMap.fastRouterMap_.insert({uid + 1, {"testNetworkId1", DEVICE_ROLE_NONE}});
256
257 audioRouteMap.RemoveDeviceInFastRouterMap(networkId);
258 }
259
AudioRouteMapGetNetworkIDInFastRouterMapFuzzTest()260 void AudioRouteMapGetNetworkIDInFastRouterMapFuzzTest()
261 {
262 AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
263 audioRouteMap.fastRouterMap_.clear();
264 int32_t uid = GetData<int32_t>();
265 std::string networkId = "testNetworkId";
266 audioRouteMap.fastRouterMap_.insert({uid, {networkId, DEVICE_ROLE_NONE}});
267 audioRouteMap.fastRouterMap_.insert({uid + 1, {"testNetworkId1", DEVICE_ROLE_NONE}});
268
269 audioRouteMap.GetNetworkIDInFastRouterMap(uid, DEVICE_ROLE_NONE, networkId);
270 }
271
272 TestPtr g_testPtrs[] = {
273 AudioMicrophoneDescriptorSetMicrophoneMuteFuzzTest,
274 AudioMicrophoneDescriptorSetMicrophoneMutePersistentFuzzTest,
275 AudioMicrophoneDescriptorGetPersistentMicMuteStateFuzzTest,
276 AudioMicrophoneDescriptorInitPersistentMicrophoneMuteStateFuzzTest,
277 AudioMicrophoneDescriptorIsMicrophoneMuteFuzzTest,
278 AudioMicrophoneDescriptorGetMicrophoneMuteTemporaryFuzzTest,
279 AudioMicrophoneDescriptorAddAudioCapturerMicrophoneDescriptorFuzzTest,
280 AudioMicrophoneDescriptorGetAudioCapturerMicrophoneDescriptorsFuzzTest,
281 AudioMicrophoneDescriptorUpdateAudioCapturerMicrophoneDescriptorFuzzTest,
282 AudioMicrophoneDescriptorRemoveAudioCapturerMicrophoneDescriptorFuzzTest,
283 AudioRouteMapGetDeviceInfoByUidAndPidFuzzTest,
284 AudioRouteMapDelRouteMapInfoByKeyFuzzTest,
285 AudioRouteMapAddRouteMapInfoFuzzTest,
286 AudioRouteMapAddFastRouteMapInfoFuzzTest,
287 AudioRouteMapRemoveDeviceInRouterMapFuzzTest,
288 AudioRouteMapRemoveDeviceInFastRouterMapFuzzTest,
289 AudioRouteMapGetNetworkIDInFastRouterMapFuzzTest,
290 };
291
FuzzTest(const uint8_t * rawData,size_t size)292 void FuzzTest(const uint8_t* rawData, size_t size)
293 {
294 if (rawData == nullptr) {
295 return;
296 }
297
298 RAW_DATA = rawData;
299 g_dataSize = size;
300 g_pos = 0;
301
302 uint32_t code = GetData<uint32_t>();
303 uint32_t len = GetArrLength(g_testPtrs);
304 if (len > 0) {
305 g_testPtrs[code % len]();
306 } else {
307 AUDIO_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
308 }
309 return;
310 }
311
312 } // namespace AudioStandard
313 } // namesapce OHOS
314
315 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)316 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
317 {
318 if (size < OHOS::AudioStandard::THRESHOLD) {
319 return 0;
320 }
321 OHOS::AudioStandard::FuzzTest(data, size);
322 return 0;
323 }