blob: 84ad60495f496cfc1e949c960b32ee5b1d23de95 [file] [log] [blame]
Mufaddal Chakera253887f2020-12-09 17:17:37 +05301/******************************************************************************
2 *
3 * Copyright (C) 2021 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18#include <stdint.h>
19#include <sys/wait.h>
20#include <unistd.h>
21#include <algorithm>
22#include <memory>
23#include <string>
24#include <utility>
25#include <vector>
26
27#include <Serializer.h>
28#include <android-base/file.h>
Svet Ganov33761132021-05-13 22:51:08 +000029#include <android/content/AttributionSourceState.h>
Mufaddal Chakera253887f2020-12-09 17:17:37 +053030#include <libxml/parser.h>
31#include <libxml/xinclude.h>
32#include <media/AudioPolicy.h>
Dorin Drimusf2196d82022-01-03 12:11:18 +010033#include <media/AudioProfile.h>
Mufaddal Chakera253887f2020-12-09 17:17:37 +053034#include <media/PatchBuilder.h>
35#include <media/RecordingActivityTracker.h>
36
37#include <AudioPolicyInterface.h>
38#include <android_audio_policy_configuration_V7_0-enums.h>
39#include <fuzzer/FuzzedDataProvider.h>
40#include <tests/AudioPolicyManagerTestClient.h>
41#include <tests/AudioPolicyTestClient.h>
42#include <tests/AudioPolicyTestManager.h>
43#include <xsdc/XsdcSupport.h>
44
45using namespace android;
46
47namespace xsd {
48using namespace ::android::audio::policy::configuration::V7_0;
49}
50
Svet Ganov33761132021-05-13 22:51:08 +000051using content::AttributionSourceState;
Philip P. Moltmannbda45752020-07-17 16:41:18 -070052
Mufaddal Chakera253887f2020-12-09 17:17:37 +053053static const std::vector<audio_format_t> kAudioFormats = [] {
54 std::vector<audio_format_t> result;
55 for (const auto enumVal : xsdc_enum_range<xsd::AudioFormat>{}) {
56 audio_format_t audioFormatHal;
57 std::string audioFormat = toString(enumVal);
58 if (audio_format_from_string(audioFormat.c_str(), &audioFormatHal)) {
59 result.push_back(audioFormatHal);
60 }
61 }
62 return result;
63}();
64
65static const std::vector<audio_channel_mask_t> kAudioChannelOutMasks = [] {
66 std::vector<audio_channel_mask_t> result;
67 for (const auto enumVal : xsdc_enum_range<xsd::AudioChannelMask>{}) {
68 audio_channel_mask_t audioChannelMaskHal;
69 std::string audioChannelMask = toString(enumVal);
70 if (enumVal != xsd::AudioChannelMask::AUDIO_CHANNEL_NONE &&
71 audioChannelMask.find("_IN_") == std::string::npos &&
72 audio_channel_mask_from_string(audioChannelMask.c_str(), &audioChannelMaskHal)) {
73 result.push_back(audioChannelMaskHal);
74 }
75 }
76 return result;
77}();
78
79static const std::vector<audio_channel_mask_t> kAudioChannelInMasks = [] {
80 std::vector<audio_channel_mask_t> result;
81 for (const auto enumVal : xsdc_enum_range<xsd::AudioChannelMask>{}) {
82 audio_channel_mask_t audioChannelMaskHal;
83 std::string audioChannelMask = toString(enumVal);
84 if (enumVal != xsd::AudioChannelMask::AUDIO_CHANNEL_NONE &&
85 audioChannelMask.find("_OUT_") == std::string::npos &&
86 audio_channel_mask_from_string(audioChannelMask.c_str(), &audioChannelMaskHal)) {
87 result.push_back(audioChannelMaskHal);
88 }
89 }
90 return result;
91}();
92
93static const std::vector<audio_output_flags_t> kAudioOutputFlags = [] {
94 std::vector<audio_output_flags_t> result;
95 for (const auto enumVal : xsdc_enum_range<xsd::AudioInOutFlag>{}) {
96 audio_output_flags_t audioOutputFlagHal;
97 std::string audioOutputFlag = toString(enumVal);
98 if (audioOutputFlag.find("_OUTPUT_") != std::string::npos &&
99 audio_output_flag_from_string(audioOutputFlag.c_str(), &audioOutputFlagHal)) {
100 result.push_back(audioOutputFlagHal);
101 }
102 }
103 return result;
104}();
105
106static const std::vector<audio_devices_t> kAudioDevices = [] {
107 std::vector<audio_devices_t> result;
108 for (const auto enumVal : xsdc_enum_range<xsd::AudioDevice>{}) {
109 audio_devices_t audioDeviceHal;
110 std::string audioDevice = toString(enumVal);
111 if (audio_device_from_string(audioDevice.c_str(), &audioDeviceHal)) {
112 result.push_back(audioDeviceHal);
113 }
114 }
115 return result;
116}();
117
118static const std::vector<audio_usage_t> kAudioUsages = [] {
119 std::vector<audio_usage_t> result;
120 for (const auto enumVal : xsdc_enum_range<xsd::AudioUsage>{}) {
121 audio_usage_t audioUsageHal;
122 std::string audioUsage = toString(enumVal);
123 if (audio_usage_from_string(audioUsage.c_str(), &audioUsageHal)) {
124 result.push_back(audioUsageHal);
125 }
126 }
127 return result;
128}();
129
Ayushi Khopkar997d3732022-02-03 12:18:47 +0000130/**
131 * AudioSource - AUDIO_SOURCE_VOICE_COMMUNICATION and AUDIO_SOURCE_HOTWORD
132 * are excluded from kAudioSources[] in order to avoid the abort triggered
133 * for these two types of AudioSource in Engine::getDeviceForInputSource()
134 */
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530135static const std::vector<audio_source_t> kAudioSources = [] {
136 std::vector<audio_source_t> result;
137 for (const auto enumVal : xsdc_enum_range<xsd::AudioSource>{}) {
138 audio_source_t audioSourceHal;
139 std::string audioSource = toString(enumVal);
Ayushi Khopkar997d3732022-02-03 12:18:47 +0000140 if (enumVal != xsd::AudioSource::AUDIO_SOURCE_VOICE_COMMUNICATION &&
141 enumVal != xsd::AudioSource::AUDIO_SOURCE_HOTWORD &&
142 audio_source_from_string(audioSource.c_str(), &audioSourceHal)) {
143 result.push_back(audioSourceHal);
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530144 }
145 }
146 return result;
147}();
148
149static const std::vector<audio_content_type_t> kAudioContentTypes = [] {
150 std::vector<audio_content_type_t> result;
151 for (const auto enumVal : xsdc_enum_range<xsd::AudioContentType>{}) {
152 audio_content_type_t audioContentTypeHal;
153 std::string audioContentType = toString(enumVal);
154 if (audio_content_type_from_string(audioContentType.c_str(), &audioContentTypeHal)) {
155 result.push_back(audioContentTypeHal);
156 }
157 }
158 return result;
159}();
160
161std::vector<int> kMixTypes = {MIX_TYPE_PLAYERS, MIX_TYPE_RECORDERS};
162
163std::vector<int> kMixRouteFlags = {MIX_ROUTE_FLAG_RENDER, MIX_ROUTE_FLAG_LOOP_BACK,
164 MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER, MIX_ROUTE_FLAG_ALL};
165
166std::vector<audio_flags_mask_t> kAudioFlagMasks = {
167 AUDIO_FLAG_NONE, AUDIO_FLAG_AUDIBILITY_ENFORCED,
168 AUDIO_FLAG_SECURE, AUDIO_FLAG_SCO,
169 AUDIO_FLAG_BEACON, AUDIO_FLAG_HW_AV_SYNC,
170 AUDIO_FLAG_HW_HOTWORD, AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY,
171 AUDIO_FLAG_BYPASS_MUTE, AUDIO_FLAG_LOW_LATENCY,
172 AUDIO_FLAG_DEEP_BUFFER, AUDIO_FLAG_NO_MEDIA_PROJECTION,
173 AUDIO_FLAG_MUTE_HAPTIC, AUDIO_FLAG_NO_SYSTEM_CAPTURE,
Eric Laurentac08f912021-08-25 15:01:05 +0200174 AUDIO_FLAG_CAPTURE_PRIVATE, AUDIO_FLAG_CONTENT_SPATIALIZED,
175 AUDIO_FLAG_NEVER_SPATIALIZE,
176 };
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530177
178std::vector<audio_policy_dev_state_t> kAudioPolicyDeviceStates = {
179 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
180 AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
181 AUDIO_POLICY_DEVICE_STATE_CNT,
182};
183
184std::vector<uint32_t> kSamplingRates = {8000, 16000, 44100, 48000, 88200, 96000};
185
186template <typename T>
187T getValueFromVector(FuzzedDataProvider *fdp, std::vector<T> arr) {
188 if (fdp->ConsumeBool()) {
189 return arr[fdp->ConsumeIntegralInRange<int32_t>(0, arr.size() - 1)];
190 } else {
191 return (T)fdp->ConsumeIntegral<uint32_t>();
192 }
193}
194
195class AudioPolicyManagerFuzzer {
196 public:
197 explicit AudioPolicyManagerFuzzer(FuzzedDataProvider *fdp);
198 virtual ~AudioPolicyManagerFuzzer() = default;
199 virtual bool initialize();
200 virtual void SetUpManagerConfig();
Robert Wufb971192024-10-30 21:54:35 +0000201 bool getOutputForAttr(DeviceIdVector *selectedDeviceIds, audio_format_t format,
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530202 audio_channel_mask_t channelMask, int sampleRate,
203 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
204 audio_io_handle_t *output = nullptr,
205 audio_port_handle_t *portId = nullptr, audio_attributes_t attr = {});
206 bool getInputForAttr(const audio_attributes_t &attr, audio_unique_id_t riid,
207 audio_port_handle_t *selectedDeviceId, audio_format_t format,
208 audio_channel_mask_t channelMask, int sampleRate,
209 audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100210 audio_port_handle_t *portId = nullptr,
211 uint32_t *virtualDeviceId = nullptr);
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530212 bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
213 const std::string &address, audio_port_v7 *foundPort);
214 static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch *patch);
215 audio_patch createFuzzedPatch();
216 void fuzzPatchCreation();
217 virtual void process();
218
219 protected:
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700220 sp<AudioPolicyConfig> mConfig{AudioPolicyConfig::createWritableForTests()};
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530221 std::unique_ptr<AudioPolicyManagerTestClient> mClient{new AudioPolicyManagerTestClient};
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700222 std::unique_ptr<AudioPolicyTestManager> mManager;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530223 FuzzedDataProvider *mFdp;
224};
225
226AudioPolicyManagerFuzzer::AudioPolicyManagerFuzzer(FuzzedDataProvider *fdp)
227 : mFdp(fdp) {}
228
229bool AudioPolicyManagerFuzzer::initialize() {
230 if (mFdp->remaining_bytes() < 1) {
231 return false;
232 }
233 // init code
234 SetUpManagerConfig();
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700235 if (mConfig == nullptr) {
236 return false;
237 }
238 mManager.reset(new AudioPolicyTestManager(mConfig, mClient.get()));
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530239 if (mManager->initialize() != NO_ERROR) {
240 return false;
241 }
242 if (mManager->initCheck() != NO_ERROR) {
243 return false;
244 }
245 return true;
246}
247
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700248void AudioPolicyManagerFuzzer::SetUpManagerConfig() { mConfig->setDefault(); }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530249
250bool AudioPolicyManagerFuzzer::getOutputForAttr(
Robert Wufb971192024-10-30 21:54:35 +0000251 DeviceIdVector *selectedDeviceIds, audio_format_t format, audio_channel_mask_t channelMask,
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530252 int sampleRate, audio_output_flags_t flags, audio_io_handle_t *output,
253 audio_port_handle_t *portId, audio_attributes_t attr) {
254 audio_io_handle_t localOutput;
255 if (!output) output = &localOutput;
256 *output = AUDIO_IO_HANDLE_NONE;
257 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
258 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
259 config.sample_rate = sampleRate;
260 config.channel_mask = channelMask;
261 config.format = format;
262 audio_port_handle_t localPortId;
263 if (!portId) portId = &localPortId;
264 *portId = AUDIO_PORT_HANDLE_NONE;
265 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200266 bool isSpatialized;
jiabinc658e452022-10-21 20:52:21 +0000267 bool isBitPerfect;
Andy Hung6b137d12024-08-27 22:35:17 +0000268 float volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700269 bool muted;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530270
Svet Ganov33761132021-05-13 22:51:08 +0000271 // TODO b/182392769: use attribution source util
272 AttributionSourceState attributionSource;
273 attributionSource.uid = 0;
274 attributionSource.token = sp<BBinder>::make();
275 if (mManager->getOutputForAttr(&attr, output, AUDIO_SESSION_NONE, &stream, attributionSource,
Robert Wufb971192024-10-30 21:54:35 +0000276 &config, &flags, selectedDeviceIds, portId, {}, &outputType, &isSpatialized,
Vlad Popa1e865e62024-08-15 19:11:42 -0700277 &isBitPerfect, &volume, &muted) != OK) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530278 return false;
279 }
280 if (*output == AUDIO_IO_HANDLE_NONE || *portId == AUDIO_PORT_HANDLE_NONE) {
281 return false;
282 }
283 return true;
284}
285
286bool AudioPolicyManagerFuzzer::getInputForAttr(
287 const audio_attributes_t &attr, audio_unique_id_t riid, audio_port_handle_t *selectedDeviceId,
288 audio_format_t format, audio_channel_mask_t channelMask, int sampleRate,
Atneya Nair25fbcf22024-11-19 19:53:23 -0800289 audio_input_flags_t flags, audio_port_handle_t *portId, uint32_t*) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530290 audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
291 audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
292 config.sample_rate = sampleRate;
293 config.channel_mask = channelMask;
294 config.format = format;
295 audio_port_handle_t localPortId;
296 if (!portId) portId = &localPortId;
297 *portId = AUDIO_PORT_HANDLE_NONE;
298 AudioPolicyInterface::input_type_t inputType;
299
Svet Ganov33761132021-05-13 22:51:08 +0000300 AttributionSourceState attributionSource;
301 attributionSource.uid = 0;
302 attributionSource.token = sp<BBinder>::make();
Atneya Nair25fbcf22024-11-19 19:53:23 -0800303 const auto inputRes =
304 mManager->getInputForAttr(attr, input, *selectedDeviceId, config, flags, riid,
305 AUDIO_SESSION_NONE, attributionSource, &inputType);
306 if (!inputRes.has_value()) return false;
307
308 if (inputRes->portId == AUDIO_PORT_HANDLE_NONE || inputRes->input == AUDIO_IO_HANDLE_NONE) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530309 return false;
310 }
311 return true;
312}
313
314bool AudioPolicyManagerFuzzer::findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
315 const std::string &address,
316 audio_port_v7 *foundPort) {
317 uint32_t numPorts = 0;
318 uint32_t generation1;
319 status_t ret;
320
321 ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
322 if (ret != NO_ERROR) {
323 return false;
324 }
325
326 uint32_t generation2;
327 struct audio_port_v7 ports[numPorts];
328 ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation2);
329 if (ret != NO_ERROR) {
330 return false;
331 }
332
333 for (const auto &port : ports) {
334 if (port.role == role && port.ext.device.type == deviceType &&
335 (strncmp(port.ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN) ==
336 0)) {
337 if (foundPort) *foundPort = port;
338 return true;
339 }
340 }
341 return false;
342}
343
344audio_port_handle_t AudioPolicyManagerFuzzer::getDeviceIdFromPatch(
345 const struct audio_patch *patch) {
346 if (patch->num_sources != 0 && patch->num_sinks != 0) {
347 if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
348 return patch->sinks[0].id;
349 } else {
350 return patch->sources[0].id;
351 }
352 }
353 return AUDIO_PORT_HANDLE_NONE;
354}
355
356audio_patch AudioPolicyManagerFuzzer::createFuzzedPatch() {
357 audio_patch patch{};
358 patch.id = mFdp->ConsumeIntegral<uint32_t>();
359 patch.num_sources = mFdp->ConsumeIntegralInRange(0, AUDIO_PATCH_PORTS_MAX);
360 for (int i = 0; i < patch.num_sources; ++i) {
361 audio_port_config config{};
362 std::vector<uint8_t> bytes = mFdp->ConsumeBytes<uint8_t>(sizeof(config));
363 memcpy(reinterpret_cast<uint8_t *>(&config), &bytes[0], bytes.size());
364 patch.sources[i] = config;
365 }
366 patch.num_sinks = mFdp->ConsumeIntegralInRange(0, AUDIO_PATCH_PORTS_MAX);
367 for (int i = 0; i < patch.num_sinks; ++i) {
368 audio_port_config config{};
369 std::vector<uint8_t> bytes = mFdp->ConsumeBytes<uint8_t>(sizeof(config));
370 memcpy(reinterpret_cast<uint8_t *>(&config), &bytes[0], bytes.size());
371 patch.sinks[i] = config;
372 }
373 return patch;
374}
375
376void AudioPolicyManagerFuzzer::fuzzPatchCreation() {
377 if (mFdp->remaining_bytes()) {
378 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
379 uid_t uid = mFdp->ConsumeIntegral<uint32_t>();
380
381 // create a fuzzed patch
382 handle = AUDIO_PATCH_HANDLE_NONE;
383 audio_patch patch = createFuzzedPatch();
384 uid = mFdp->ConsumeIntegral<uint32_t>();
385 if (mManager->createAudioPatch(&patch, &handle, uid) == NO_ERROR) {
386 mManager->releaseAudioPatch(handle, uid);
387 }
388 }
389}
390
391void AudioPolicyManagerFuzzer::process() {
392 if (initialize()) {
393 fuzzPatchCreation();
394 }
395}
396
397class AudioPolicyManagerFuzzerWithConfigurationFile : public AudioPolicyManagerFuzzer {
398 public:
399 explicit AudioPolicyManagerFuzzerWithConfigurationFile(FuzzedDataProvider *fdp)
400 : AudioPolicyManagerFuzzer(fdp){};
401
402 protected:
403 void SetUpManagerConfig() override;
404 virtual std::string getConfigFile();
405 void traverseAndFuzzXML(xmlDocPtr pDoc, xmlNodePtr curr);
406 std::string fuzzXML(std::string xmlPath);
407
408 static inline const std::string sExecutableDir = base::GetExecutableDirectory() + "/";
409 static inline const std::string sDefaultConfig =
410 sExecutableDir + "data/test_audio_policy_configuration.xml";
411 static inline const std::string sFuzzedConfig = sExecutableDir + "fuzzed.xml";;
412};
413
414std::string AudioPolicyManagerFuzzerWithConfigurationFile::getConfigFile() {
415 return fuzzXML(sDefaultConfig);
416}
417
418void AudioPolicyManagerFuzzerWithConfigurationFile::SetUpManagerConfig() {
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700419 const std::string configFilePath = getConfigFile();
420 auto result = AudioPolicyConfig::loadFromCustomXmlConfigForTests(configFilePath);
421 mConfig = result.ok() ? mConfig = result.value() : nullptr;
422 ALOGE_IF(!result.ok(), "%s: Failed to deserialize \"%s\": %d",
423 __func__, configFilePath.c_str(), result.error());
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530424}
425
426void AudioPolicyManagerFuzzerWithConfigurationFile::traverseAndFuzzXML(xmlDocPtr pDoc,
427 xmlNodePtr curr) {
428 if (curr == nullptr) {
429 return;
430 }
431
432 xmlAttr *attribute = curr->properties;
433 while (attribute) {
434 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("format"))) {
435 const char *newFormat =
436 audio_format_to_string(getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
437 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newFormat));
438 }
439 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("flags"))) {
440 std::string newFlag = "";
441 uint16_t numFlags = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
442 for (uint16_t i = 0; i < numFlags; ++i) {
443 newFlag += std::string(audio_output_flag_to_string(
444 getValueFromVector<audio_output_flags_t>(mFdp, kAudioOutputFlags)));
445 if (i != (numFlags - 1)) {
446 newFlag += std::string("|");
447 }
448 }
449 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newFlag.c_str()));
450 }
451 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("samplingRates"))) {
452 std::string newRate = "";
453 uint16_t numRates = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
454 for (uint16_t i = 0; i < numRates; ++i) {
455 newRate += std::to_string(getValueFromVector<uint32_t>(mFdp, kSamplingRates));
456 if (i != (numRates - 1)) {
457 newRate += std::string(",");
458 }
459 }
460 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newRate.c_str()));
461 }
462 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("channelMasks"))) {
463 int isOutMask = -1;
464 char *value =
465 reinterpret_cast<char *>(xmlNodeListGetString(pDoc, attribute->children, 1));
466 if (std::string(value).find(std::string("_OUT_")) != std::string::npos) {
467 // OUT mask
468 isOutMask = 1;
469 } else if (std::string(value).find(std::string("_IN_")) != std::string::npos) {
470 // IN mask
471 isOutMask = 0;
472 }
473 if (isOutMask != -1) {
474 std::string newMask = "";
475 uint16_t numMasks = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
476 for (uint16_t i = 0; i < numMasks; ++i) {
477 if (isOutMask) {
478 newMask += std::string(audio_channel_out_mask_to_string(
479 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks)));
480 } else {
481 newMask += std::string(audio_channel_in_mask_to_string(
482 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks)));
483 }
484 if (i != (numMasks - 1)) {
485 newMask += std::string(",");
486 }
487 }
488 xmlSetProp(curr, attribute->name,
489 reinterpret_cast<const xmlChar *>(newMask.c_str()));
490 }
491 xmlFree(value);
492 }
493 attribute = attribute->next;
494 }
495
496 curr = curr->xmlChildrenNode;
497 while (curr != nullptr) {
498 traverseAndFuzzXML(pDoc, curr);
499 curr = curr->next;
500 }
501}
502
503std::string AudioPolicyManagerFuzzerWithConfigurationFile::fuzzXML(std::string xmlPath) {
504 std::string outPath = sFuzzedConfig;
505
506 // Load in the xml file from disk
507 xmlDocPtr pDoc = xmlParseFile(xmlPath.c_str());
508 xmlNodePtr root = xmlDocGetRootElement(pDoc);
509
510 traverseAndFuzzXML(pDoc, root);
511
512 // Save the document back out to disk.
513 xmlSaveFileEnc(outPath.c_str(), pDoc, "UTF-8");
514 xmlFreeDoc(pDoc);
515
516 return outPath;
517}
518
519class AudioPolicyManagerFuzzerMsd : public AudioPolicyManagerFuzzerWithConfigurationFile {
520 public:
521 explicit AudioPolicyManagerFuzzerMsd(FuzzedDataProvider *fdp)
522 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp) {}
523
524 protected:
525 std::string getConfigFile() override;
526
527 static inline const std::string sMsdConfig =
528 sExecutableDir + "data/test_audio_policy_msd_configuration.xml";
529};
530
531std::string AudioPolicyManagerFuzzerMsd::getConfigFile() { return fuzzXML(sMsdConfig); }
532
533using PolicyMixTuple = std::tuple<audio_usage_t, audio_source_t, uint32_t>;
534
535class AudioPolicyManagerFuzzerDynamicPolicy : public AudioPolicyManagerFuzzerWithConfigurationFile {
536 public:
537 explicit AudioPolicyManagerFuzzerDynamicPolicy(FuzzedDataProvider *fdp)
538 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
539 ~AudioPolicyManagerFuzzerDynamicPolicy() override;
540 void process() override;
541
542 protected:
543 status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType,
544 std::string mixAddress, const audio_config_t &audioConfig,
545 const std::vector<PolicyMixTuple> &rules);
546 void clearPolicyMix();
547 void registerPolicyMixes();
548 void unregisterPolicyMixes();
549
550 Vector<AudioMix> mAudioMixes;
551 const std::string mMixAddress = "remote_submix_media";
552};
553
554AudioPolicyManagerFuzzerDynamicPolicy::~AudioPolicyManagerFuzzerDynamicPolicy() {
555 clearPolicyMix();
556}
557
558status_t AudioPolicyManagerFuzzerDynamicPolicy::addPolicyMix(
559 int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress,
560 const audio_config_t &audioConfig, const std::vector<PolicyMixTuple> &rules) {
Jan Sebechlebsky069787e2022-08-17 14:07:45 +0200561 std::vector<AudioMixMatchCriterion> myMixMatchCriteria;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530562
Jan Sebechlebsky069787e2022-08-17 14:07:45 +0200563 myMixMatchCriteria.reserve(rules.size());
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530564 for (const auto &rule : rules) {
Jan Sebechlebsky069787e2022-08-17 14:07:45 +0200565 myMixMatchCriteria.push_back(
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530566 AudioMixMatchCriterion(std::get<0>(rule), std::get<1>(rule), std::get<2>(rule)));
567 }
568
569 AudioMix myAudioMix(myMixMatchCriteria, mixType, audioConfig, mixFlag,
570 String8(mixAddress.c_str()), 0);
571 myAudioMix.mDeviceType = deviceType;
572 // Clear mAudioMix before add new one to make sure we don't add already existing mixes.
573 mAudioMixes.clear();
574 mAudioMixes.add(myAudioMix);
575
576 // As the policy mixes registration may fail at some case,
577 // caller need to check the returned status.
578 status_t ret = mManager->registerPolicyMixes(mAudioMixes);
579 return ret;
580}
581
582void AudioPolicyManagerFuzzerDynamicPolicy::clearPolicyMix() {
583 if (mManager != nullptr) {
584 mManager->unregisterPolicyMixes(mAudioMixes);
585 }
586 mAudioMixes.clear();
587}
588
589void AudioPolicyManagerFuzzerDynamicPolicy::registerPolicyMixes() {
590 const uint32_t numPolicies = mFdp->ConsumeIntegralInRange<uint32_t>(1, MAX_MIXES_PER_POLICY);
591
592 for (int i = 0; i < numPolicies; ++i) {
593 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
594 audioConfig.channel_mask = getValueFromVector<audio_channel_mask_t>(
595 mFdp, mFdp->ConsumeBool() ? kAudioChannelInMasks : kAudioChannelOutMasks);
596 audioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
597 audioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
598 addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
599 getValueFromVector<int>(mFdp, kMixRouteFlags),
600 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), "", audioConfig,
601 std::vector<PolicyMixTuple>());
602 }
603}
604
605void AudioPolicyManagerFuzzerDynamicPolicy::unregisterPolicyMixes() {
606 mManager->unregisterPolicyMixes(mAudioMixes);
607}
608
609void AudioPolicyManagerFuzzerDynamicPolicy::process() {
610 if (initialize()) {
611 registerPolicyMixes();
612 fuzzPatchCreation();
613 unregisterPolicyMixes();
614 }
615}
616
617class AudioPolicyManagerFuzzerDPNoRemoteSubmixModule
618 : public AudioPolicyManagerFuzzerDynamicPolicy {
619 public:
620 explicit AudioPolicyManagerFuzzerDPNoRemoteSubmixModule(FuzzedDataProvider *fdp)
621 : AudioPolicyManagerFuzzerDynamicPolicy(fdp){};
622
623 protected:
624 std::string getConfigFile() override;
625
626 static inline const std::string sPrimaryOnlyConfig =
627 sExecutableDir + "data/test_audio_policy_primary_only_configuration.xml";
628};
629
630std::string AudioPolicyManagerFuzzerDPNoRemoteSubmixModule::getConfigFile() {
631 return fuzzXML(sPrimaryOnlyConfig);
632}
633
634class AudioPolicyManagerFuzzerDPPlaybackReRouting : public AudioPolicyManagerFuzzerDynamicPolicy {
635 public:
636 explicit AudioPolicyManagerFuzzerDPPlaybackReRouting(FuzzedDataProvider *fdp);
637 ~AudioPolicyManagerFuzzerDPPlaybackReRouting() override;
638 void process() override;
639
640 protected:
641 bool initialize() override;
642 void playBackReRouting();
643
644 std::unique_ptr<RecordingActivityTracker> mTracker;
645
646 std::vector<PolicyMixTuple> mUsageRules = {
647 {AUDIO_USAGE_MEDIA, AUDIO_SOURCE_DEFAULT, RULE_MATCH_ATTRIBUTE_USAGE},
648 {AUDIO_USAGE_ALARM, AUDIO_SOURCE_DEFAULT, RULE_MATCH_ATTRIBUTE_USAGE}};
649
650 struct audio_port_v7 mInjectionPort;
651 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
652 audio_config_t mAudioConfig;
653};
654
655AudioPolicyManagerFuzzerDPPlaybackReRouting::AudioPolicyManagerFuzzerDPPlaybackReRouting(
656 FuzzedDataProvider *fdp)
657 : AudioPolicyManagerFuzzerDynamicPolicy(fdp) {
658 const uint32_t numRules = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
659 for (int i = 0; i < numRules; ++i) {
660 PolicyMixTuple rule = {getValueFromVector<audio_usage_t>(mFdp, kAudioUsages),
661 getValueFromVector<audio_source_t>(mFdp, kAudioSources),
662 RULE_MATCH_ATTRIBUTE_USAGE};
663 mUsageRules.push_back(rule);
664 }
665}
666
667AudioPolicyManagerFuzzerDPPlaybackReRouting::~AudioPolicyManagerFuzzerDPPlaybackReRouting() {
Munna Verma5f7cabd2023-06-20 16:22:16 +0530668 if (mManager) {
669 mManager->stopInput(mPortId);
670 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530671}
672
673bool AudioPolicyManagerFuzzerDPPlaybackReRouting::initialize() {
Mufaddal Chakera5d9a9e02021-02-16 14:18:54 +0530674 if (!AudioPolicyManagerFuzzerDynamicPolicy::initialize()) {
675 return false;
676 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530677 mTracker.reset(new RecordingActivityTracker());
678
679 mAudioConfig = AUDIO_CONFIG_INITIALIZER;
680 mAudioConfig.channel_mask =
681 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks);
682 mAudioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
683 mAudioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
684 status_t ret = addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
685 getValueFromVector<int>(mFdp, kMixRouteFlags),
686 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
687 mMixAddress, mAudioConfig, mUsageRules);
688 if (ret != NO_ERROR) {
689 return false;
690 }
691
692 struct audio_port_v7 extractionPort;
693 findDevicePort(AUDIO_PORT_ROLE_SOURCE, getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
694 mMixAddress, &extractionPort);
695
696 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
697 audio_source_t source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
698 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source,
699 AUDIO_FLAG_NONE, ""};
700 std::string tags = "addr=" + mMixAddress;
701 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
702 getInputForAttr(attr, mTracker->getRiid(), &selectedDeviceId, mAudioConfig.format,
703 mAudioConfig.channel_mask, mAudioConfig.sample_rate, AUDIO_INPUT_FLAG_NONE,
704 &mPortId);
705
706 ret = mManager->startInput(mPortId);
707 if (ret != NO_ERROR) {
708 return false;
709 }
710 if (!findDevicePort(AUDIO_PORT_ROLE_SINK,
711 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), mMixAddress,
712 &mInjectionPort)) {
713 return false;
714 }
715
716 return true;
717}
718
719void AudioPolicyManagerFuzzerDPPlaybackReRouting::playBackReRouting() {
720 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
721 for (int i = 0; i < numTestCases; ++i) {
722 audio_attributes_t attr;
723 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
724 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
725 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
726 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
727 std::string tags(mFdp->ConsumeBool() ? "" : "addr=remote_submix_media");
728 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
729
Robert Wufb971192024-10-30 21:54:35 +0000730 DeviceIdVector playbackRoutedPortIds;
731 getOutputForAttr(&playbackRoutedPortIds, mAudioConfig.format, mAudioConfig.channel_mask,
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530732 mAudioConfig.sample_rate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/,
733 nullptr /*portId*/, attr);
734 }
735}
736
737void AudioPolicyManagerFuzzerDPPlaybackReRouting::process() {
738 if (initialize()) {
739 playBackReRouting();
740 registerPolicyMixes();
741 fuzzPatchCreation();
742 unregisterPolicyMixes();
743 }
744}
745
746class AudioPolicyManagerFuzzerDPMixRecordInjection : public AudioPolicyManagerFuzzerDynamicPolicy {
747 public:
748 explicit AudioPolicyManagerFuzzerDPMixRecordInjection(FuzzedDataProvider *fdp);
749 ~AudioPolicyManagerFuzzerDPMixRecordInjection() override;
750 void process() override;
751
752 protected:
753 bool initialize() override;
754 void recordingInjection();
755
756 std::unique_ptr<RecordingActivityTracker> mTracker;
757
758 std::vector<PolicyMixTuple> mSourceRules = {
759 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_CAMCORDER, RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET},
760 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_MIC, RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET},
761 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_VOICE_COMMUNICATION,
762 RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET}};
763
764 struct audio_port_v7 mExtractionPort;
765 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
766 audio_config_t mAudioConfig;
767};
768
769AudioPolicyManagerFuzzerDPMixRecordInjection::AudioPolicyManagerFuzzerDPMixRecordInjection(
770 FuzzedDataProvider *fdp)
771 : AudioPolicyManagerFuzzerDynamicPolicy(fdp) {
772 const uint32_t numRules = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
773 for (int i = 0; i < numRules; ++i) {
774 PolicyMixTuple rule = {getValueFromVector<audio_usage_t>(mFdp, kAudioUsages),
775 getValueFromVector<audio_source_t>(mFdp, kAudioSources),
776 RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET};
777 mSourceRules.push_back(rule);
778 }
779}
780
781AudioPolicyManagerFuzzerDPMixRecordInjection::~AudioPolicyManagerFuzzerDPMixRecordInjection() {
Munna Verma5f7cabd2023-06-20 16:22:16 +0530782 if (mManager) {
783 mManager->stopOutput(mPortId);
784 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530785}
786
787bool AudioPolicyManagerFuzzerDPMixRecordInjection::initialize() {
Mufaddal Chakera5d9a9e02021-02-16 14:18:54 +0530788 if (!AudioPolicyManagerFuzzerDynamicPolicy::initialize()) {
789 return false;
790 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530791
792 mTracker.reset(new RecordingActivityTracker());
793
794 mAudioConfig = AUDIO_CONFIG_INITIALIZER;
795 mAudioConfig.channel_mask =
796 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks);
797 mAudioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
798 mAudioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
799 status_t ret = addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
800 getValueFromVector<int>(mFdp, kMixRouteFlags),
801 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
802 mMixAddress, mAudioConfig, mSourceRules);
803 if (ret != NO_ERROR) {
804 return false;
805 }
806
807 struct audio_port_v7 injectionPort;
808 findDevicePort(AUDIO_PORT_ROLE_SINK, getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
809 mMixAddress, &injectionPort);
810
Robert Wufb971192024-10-30 21:54:35 +0000811 DeviceIdVector selectedDeviceIds;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530812 audio_usage_t usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
813 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, usage, AUDIO_SOURCE_DEFAULT,
814 AUDIO_FLAG_NONE, ""};
815 std::string tags = std::string("addr=") + mMixAddress;
816 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
Robert Wufb971192024-10-30 21:54:35 +0000817 getOutputForAttr(&selectedDeviceIds, mAudioConfig.format, mAudioConfig.channel_mask,
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530818 mAudioConfig.sample_rate /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE,
819 nullptr /*output*/, &mPortId, attr);
820 ret = mManager->startOutput(mPortId);
821 if (ret != NO_ERROR) {
822 return false;
823 }
824 getDeviceIdFromPatch(mClient->getLastAddedPatch());
825 if (!findDevicePort(AUDIO_PORT_ROLE_SOURCE,
826 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), mMixAddress,
827 &mExtractionPort)) {
828 return false;
829 }
830
831 return true;
832}
833
834void AudioPolicyManagerFuzzerDPMixRecordInjection::recordingInjection() {
835 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
836 for (int i = 0; i < numTestCases; ++i) {
837 audio_attributes_t attr;
838 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
839 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
840 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
841 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
842 std::string tags(mFdp->ConsumeBool() ? "" : "addr=remote_submix_media");
843 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
844
845 audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE;
846 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
847 getInputForAttr(attr, mTracker->getRiid(), &captureRoutedPortId, mAudioConfig.format,
848 mAudioConfig.channel_mask, mAudioConfig.sample_rate, AUDIO_INPUT_FLAG_NONE,
849 &portId);
850 }
851}
852
853void AudioPolicyManagerFuzzerDPMixRecordInjection::process() {
854 if (initialize()) {
855 recordingInjection();
856 registerPolicyMixes();
857 fuzzPatchCreation();
858 unregisterPolicyMixes();
859 }
860}
861
862using DeviceConnectionTestParams =
863 std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
864
865class AudioPolicyManagerFuzzerDeviceConnection
866 : public AudioPolicyManagerFuzzerWithConfigurationFile {
867 public:
868 explicit AudioPolicyManagerFuzzerDeviceConnection(FuzzedDataProvider *fdp)
869 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
870 void process() override;
871
jiabin2b9d5a12021-12-10 01:06:29 +0000872 void fuzzGetDirectPlaybackSupport();
Dorin Drimusf2196d82022-01-03 12:11:18 +0100873 void fuzzGetDirectProfilesForAttributes();
jiabin2b9d5a12021-12-10 01:06:29 +0000874
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530875 protected:
876 void setDeviceConnectionState();
877 void explicitlyRoutingAfterConnection();
878};
879
880void AudioPolicyManagerFuzzerDeviceConnection::setDeviceConnectionState() {
881 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
882 for (int i = 0; i < numTestCases; ++i) {
883 const audio_devices_t type = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
884 const std::string name = mFdp->ConsumeRandomLengthString();
885 const std::string address = mFdp->ConsumeRandomLengthString();
886 mManager->setDeviceConnectionState(
887 type, getValueFromVector<audio_policy_dev_state_t>(mFdp, kAudioPolicyDeviceStates),
888 address.c_str(), name.c_str(), getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
889 }
890}
891
892void AudioPolicyManagerFuzzerDeviceConnection::explicitlyRoutingAfterConnection() {
893 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
894 for (int i = 0; i < numTestCases; ++i) {
895 const audio_devices_t type = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
896 const std::string name = mFdp->ConsumeRandomLengthString();
897 const std::string address = mFdp->ConsumeRandomLengthString();
898 mManager->setDeviceConnectionState(
899 type, getValueFromVector<audio_policy_dev_state_t>(mFdp, kAudioPolicyDeviceStates),
900 address.c_str(), name.c_str(), getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
901
902 audio_port_v7 devicePort;
903 const audio_port_role_t role =
904 audio_is_output_device(type) ? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
905 findDevicePort(role, type, address, &devicePort);
906
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530907 // Try start input or output according to the device type
908 if (audio_is_output_devices(type)) {
Robert Wufb971192024-10-30 21:54:35 +0000909 DeviceIdVector routedPortIds = { devicePort.id };
910 getOutputForAttr(&routedPortIds,
911 getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530912 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks),
913 getValueFromVector<uint32_t>(mFdp, kSamplingRates),
914 AUDIO_OUTPUT_FLAG_NONE);
915 } else if (audio_is_input_device(type)) {
916 RecordingActivityTracker tracker;
Robert Wufb971192024-10-30 21:54:35 +0000917 audio_port_handle_t routedPortId = devicePort.id;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530918 getInputForAttr({}, tracker.getRiid(), &routedPortId,
919 getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
920 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks),
921 getValueFromVector<uint32_t>(mFdp, kSamplingRates),
922 AUDIO_INPUT_FLAG_NONE);
923 }
924 }
925}
926
jiabin2b9d5a12021-12-10 01:06:29 +0000927void AudioPolicyManagerFuzzerDeviceConnection::fuzzGetDirectPlaybackSupport() {
928 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
929 for (int i = 0; i < numTestCases; ++i) {
930 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
931 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
932 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
933 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
934 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
935 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
936 config.channel_mask = getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks);
937 config.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
938 config.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
939 mManager->getDirectPlaybackSupport(&attr, &config);
940 }
941}
942
Dorin Drimusf2196d82022-01-03 12:11:18 +0100943void AudioPolicyManagerFuzzerDeviceConnection::fuzzGetDirectProfilesForAttributes() {
944 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
945 for (int i = 0; i < numTestCases; ++i) {
946 AudioProfileVector audioProfiles;
947 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
948 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
949 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
950 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
951 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
952 mManager->getDirectProfilesForAttributes(&attr, audioProfiles);
953 }
954}
955
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530956void AudioPolicyManagerFuzzerDeviceConnection::process() {
957 if (initialize()) {
958 setDeviceConnectionState();
959 explicitlyRoutingAfterConnection();
jiabin2b9d5a12021-12-10 01:06:29 +0000960 fuzzGetDirectPlaybackSupport();
Dorin Drimusf2196d82022-01-03 12:11:18 +0100961 fuzzGetDirectProfilesForAttributes();
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530962 fuzzPatchCreation();
963 }
964}
965
966class AudioPolicyManagerTVFuzzer : public AudioPolicyManagerFuzzerWithConfigurationFile {
967 public:
968 explicit AudioPolicyManagerTVFuzzer(FuzzedDataProvider *fdp)
969 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
970 void process() override;
971
972 protected:
973 std::string getConfigFile();
974 void testHDMIPortSelection(audio_output_flags_t flags);
975
976 static inline const std::string sTvConfig =
977 AudioPolicyManagerTVFuzzer::sExecutableDir + "data/test_tv_apm_configuration.xml";
978};
979
980std::string AudioPolicyManagerTVFuzzer::getConfigFile() { return fuzzXML(sTvConfig); }
981
982void AudioPolicyManagerTVFuzzer::testHDMIPortSelection(audio_output_flags_t flags) {
983 audio_devices_t audioDevice = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
984 audio_format_t audioFormat = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
985 status_t ret = mManager->setDeviceConnectionState(
986 audioDevice, AUDIO_POLICY_DEVICE_STATE_AVAILABLE, "" /*address*/, "" /*name*/, audioFormat);
987 if (ret != NO_ERROR) {
988 return;
989 }
Robert Wufb971192024-10-30 21:54:35 +0000990 DeviceIdVector selectedDeviceIds;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530991 audio_io_handle_t output;
992 audio_port_handle_t portId;
Robert Wufb971192024-10-30 21:54:35 +0000993 getOutputForAttr(&selectedDeviceIds, getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530994 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks),
995 getValueFromVector<uint32_t>(mFdp, kSamplingRates), flags, &output, &portId);
996 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
997 if (outDesc.get() == nullptr) {
998 return;
999 }
1000 audio_port_v7 port = {};
1001 outDesc->toAudioPort(&port);
1002 mManager->releaseOutput(portId);
1003 mManager->setDeviceConnectionState(audioDevice, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
1004 "" /*address*/, "" /*name*/, audioFormat);
1005}
1006
1007void AudioPolicyManagerTVFuzzer::process() {
1008 if (initialize()) {
1009 testHDMIPortSelection(getValueFromVector<audio_output_flags_t>(mFdp, kAudioOutputFlags));
1010 fuzzPatchCreation();
1011 }
1012}
1013
1014extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
1015 if (size < 1) {
1016 return 0;
1017 }
1018 FuzzedDataProvider fdp = FuzzedDataProvider(data, size);
1019 while (fdp.remaining_bytes() > 0) {
1020 AudioPolicyManagerFuzzer audioPolicyManagerFuzzer(&fdp);
1021 audioPolicyManagerFuzzer.process();
1022
1023 AudioPolicyManagerFuzzerMsd audioPolicyManagerFuzzerMsd(&fdp);
1024 audioPolicyManagerFuzzerMsd.process();
1025
1026 AudioPolicyManagerFuzzerWithConfigurationFile audioPolicyManagerFuzzerWithConfigurationFile(
1027 &fdp);
1028 audioPolicyManagerFuzzerWithConfigurationFile.process();
1029
1030 AudioPolicyManagerFuzzerDynamicPolicy audioPolicyManagerFuzzerDynamicPolicy(&fdp);
1031 audioPolicyManagerFuzzerDynamicPolicy.process();
1032
1033 AudioPolicyManagerFuzzerDPNoRemoteSubmixModule
1034 audioPolicyManagerFuzzerDPNoRemoteSubmixModule(&fdp);
1035 audioPolicyManagerFuzzerDPNoRemoteSubmixModule.process();
1036
1037 AudioPolicyManagerFuzzerDPPlaybackReRouting audioPolicyManagerFuzzerDPPlaybackReRouting(
1038 &fdp);
1039 audioPolicyManagerFuzzerDPPlaybackReRouting.process();
1040
1041 AudioPolicyManagerFuzzerDPMixRecordInjection audioPolicyManagerFuzzerDPMixRecordInjection(
1042 &fdp);
1043 audioPolicyManagerFuzzerDPMixRecordInjection.process();
1044
1045 AudioPolicyManagerFuzzerDeviceConnection audioPolicyManagerFuzzerDeviceConnection(&fdp);
1046 audioPolicyManagerFuzzerDeviceConnection.process();
1047
1048 AudioPolicyManagerTVFuzzer audioPolicyManagerTVFuzzer(&fdp);
1049 audioPolicyManagerTVFuzzer.process();
1050 }
1051 return 0;
1052}