blob: fba4e0f2d89e6e9a460d3a61b446e1c350e4904f [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();
201 bool getOutputForAttr(audio_port_handle_t *selectedDeviceId, audio_format_t format,
202 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,
210 audio_port_handle_t *portId = nullptr);
211 bool findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
212 const std::string &address, audio_port_v7 *foundPort);
213 static audio_port_handle_t getDeviceIdFromPatch(const struct audio_patch *patch);
214 audio_patch createFuzzedPatch();
215 void fuzzPatchCreation();
216 virtual void process();
217
218 protected:
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700219 sp<AudioPolicyConfig> mConfig{AudioPolicyConfig::createWritableForTests()};
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530220 std::unique_ptr<AudioPolicyManagerTestClient> mClient{new AudioPolicyManagerTestClient};
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700221 std::unique_ptr<AudioPolicyTestManager> mManager;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530222 FuzzedDataProvider *mFdp;
223};
224
225AudioPolicyManagerFuzzer::AudioPolicyManagerFuzzer(FuzzedDataProvider *fdp)
226 : mFdp(fdp) {}
227
228bool AudioPolicyManagerFuzzer::initialize() {
229 if (mFdp->remaining_bytes() < 1) {
230 return false;
231 }
232 // init code
233 SetUpManagerConfig();
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700234 if (mConfig == nullptr) {
235 return false;
236 }
237 mManager.reset(new AudioPolicyTestManager(mConfig, mClient.get()));
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530238 if (mManager->initialize() != NO_ERROR) {
239 return false;
240 }
241 if (mManager->initCheck() != NO_ERROR) {
242 return false;
243 }
244 return true;
245}
246
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700247void AudioPolicyManagerFuzzer::SetUpManagerConfig() { mConfig->setDefault(); }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530248
249bool AudioPolicyManagerFuzzer::getOutputForAttr(
250 audio_port_handle_t *selectedDeviceId, audio_format_t format, audio_channel_mask_t channelMask,
251 int sampleRate, audio_output_flags_t flags, audio_io_handle_t *output,
252 audio_port_handle_t *portId, audio_attributes_t attr) {
253 audio_io_handle_t localOutput;
254 if (!output) output = &localOutput;
255 *output = AUDIO_IO_HANDLE_NONE;
256 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
257 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
258 config.sample_rate = sampleRate;
259 config.channel_mask = channelMask;
260 config.format = format;
261 audio_port_handle_t localPortId;
262 if (!portId) portId = &localPortId;
263 *portId = AUDIO_PORT_HANDLE_NONE;
264 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200265 bool isSpatialized;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530266
Svet Ganov33761132021-05-13 22:51:08 +0000267 // TODO b/182392769: use attribution source util
268 AttributionSourceState attributionSource;
269 attributionSource.uid = 0;
270 attributionSource.token = sp<BBinder>::make();
271 if (mManager->getOutputForAttr(&attr, output, AUDIO_SESSION_NONE, &stream, attributionSource,
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200272 &config, &flags, selectedDeviceId, portId, {}, &outputType, &isSpatialized) != OK) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530273 return false;
274 }
275 if (*output == AUDIO_IO_HANDLE_NONE || *portId == AUDIO_PORT_HANDLE_NONE) {
276 return false;
277 }
278 return true;
279}
280
281bool AudioPolicyManagerFuzzer::getInputForAttr(
282 const audio_attributes_t &attr, audio_unique_id_t riid, audio_port_handle_t *selectedDeviceId,
283 audio_format_t format, audio_channel_mask_t channelMask, int sampleRate,
284 audio_input_flags_t flags, audio_port_handle_t *portId) {
285 audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
286 audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
287 config.sample_rate = sampleRate;
288 config.channel_mask = channelMask;
289 config.format = format;
290 audio_port_handle_t localPortId;
291 if (!portId) portId = &localPortId;
292 *portId = AUDIO_PORT_HANDLE_NONE;
293 AudioPolicyInterface::input_type_t inputType;
294
Svet Ganov33761132021-05-13 22:51:08 +0000295 AttributionSourceState attributionSource;
296 attributionSource.uid = 0;
297 attributionSource.token = sp<BBinder>::make();
298 if (mManager->getInputForAttr(&attr, &input, riid, AUDIO_SESSION_NONE, attributionSource,
299 &config, flags, selectedDeviceId, &inputType, portId) != OK) {
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530300 return false;
301 }
302 if (*portId == AUDIO_PORT_HANDLE_NONE || input == AUDIO_IO_HANDLE_NONE) {
303 return false;
304 }
305 return true;
306}
307
308bool AudioPolicyManagerFuzzer::findDevicePort(audio_port_role_t role, audio_devices_t deviceType,
309 const std::string &address,
310 audio_port_v7 *foundPort) {
311 uint32_t numPorts = 0;
312 uint32_t generation1;
313 status_t ret;
314
315 ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, nullptr, &generation1);
316 if (ret != NO_ERROR) {
317 return false;
318 }
319
320 uint32_t generation2;
321 struct audio_port_v7 ports[numPorts];
322 ret = mManager->listAudioPorts(role, AUDIO_PORT_TYPE_DEVICE, &numPorts, ports, &generation2);
323 if (ret != NO_ERROR) {
324 return false;
325 }
326
327 for (const auto &port : ports) {
328 if (port.role == role && port.ext.device.type == deviceType &&
329 (strncmp(port.ext.device.address, address.c_str(), AUDIO_DEVICE_MAX_ADDRESS_LEN) ==
330 0)) {
331 if (foundPort) *foundPort = port;
332 return true;
333 }
334 }
335 return false;
336}
337
338audio_port_handle_t AudioPolicyManagerFuzzer::getDeviceIdFromPatch(
339 const struct audio_patch *patch) {
340 if (patch->num_sources != 0 && patch->num_sinks != 0) {
341 if (patch->sources[0].type == AUDIO_PORT_TYPE_MIX) {
342 return patch->sinks[0].id;
343 } else {
344 return patch->sources[0].id;
345 }
346 }
347 return AUDIO_PORT_HANDLE_NONE;
348}
349
350audio_patch AudioPolicyManagerFuzzer::createFuzzedPatch() {
351 audio_patch patch{};
352 patch.id = mFdp->ConsumeIntegral<uint32_t>();
353 patch.num_sources = mFdp->ConsumeIntegralInRange(0, AUDIO_PATCH_PORTS_MAX);
354 for (int i = 0; i < patch.num_sources; ++i) {
355 audio_port_config config{};
356 std::vector<uint8_t> bytes = mFdp->ConsumeBytes<uint8_t>(sizeof(config));
357 memcpy(reinterpret_cast<uint8_t *>(&config), &bytes[0], bytes.size());
358 patch.sources[i] = config;
359 }
360 patch.num_sinks = mFdp->ConsumeIntegralInRange(0, AUDIO_PATCH_PORTS_MAX);
361 for (int i = 0; i < patch.num_sinks; ++i) {
362 audio_port_config config{};
363 std::vector<uint8_t> bytes = mFdp->ConsumeBytes<uint8_t>(sizeof(config));
364 memcpy(reinterpret_cast<uint8_t *>(&config), &bytes[0], bytes.size());
365 patch.sinks[i] = config;
366 }
367 return patch;
368}
369
370void AudioPolicyManagerFuzzer::fuzzPatchCreation() {
371 if (mFdp->remaining_bytes()) {
372 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
373 uid_t uid = mFdp->ConsumeIntegral<uint32_t>();
374
375 // create a fuzzed patch
376 handle = AUDIO_PATCH_HANDLE_NONE;
377 audio_patch patch = createFuzzedPatch();
378 uid = mFdp->ConsumeIntegral<uint32_t>();
379 if (mManager->createAudioPatch(&patch, &handle, uid) == NO_ERROR) {
380 mManager->releaseAudioPatch(handle, uid);
381 }
382 }
383}
384
385void AudioPolicyManagerFuzzer::process() {
386 if (initialize()) {
387 fuzzPatchCreation();
388 }
389}
390
391class AudioPolicyManagerFuzzerWithConfigurationFile : public AudioPolicyManagerFuzzer {
392 public:
393 explicit AudioPolicyManagerFuzzerWithConfigurationFile(FuzzedDataProvider *fdp)
394 : AudioPolicyManagerFuzzer(fdp){};
395
396 protected:
397 void SetUpManagerConfig() override;
398 virtual std::string getConfigFile();
399 void traverseAndFuzzXML(xmlDocPtr pDoc, xmlNodePtr curr);
400 std::string fuzzXML(std::string xmlPath);
401
402 static inline const std::string sExecutableDir = base::GetExecutableDirectory() + "/";
403 static inline const std::string sDefaultConfig =
404 sExecutableDir + "data/test_audio_policy_configuration.xml";
405 static inline const std::string sFuzzedConfig = sExecutableDir + "fuzzed.xml";;
406};
407
408std::string AudioPolicyManagerFuzzerWithConfigurationFile::getConfigFile() {
409 return fuzzXML(sDefaultConfig);
410}
411
412void AudioPolicyManagerFuzzerWithConfigurationFile::SetUpManagerConfig() {
Mikhail Naganovb0fbc1b2023-04-28 13:06:32 -0700413 const std::string configFilePath = getConfigFile();
414 auto result = AudioPolicyConfig::loadFromCustomXmlConfigForTests(configFilePath);
415 mConfig = result.ok() ? mConfig = result.value() : nullptr;
416 ALOGE_IF(!result.ok(), "%s: Failed to deserialize \"%s\": %d",
417 __func__, configFilePath.c_str(), result.error());
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530418}
419
420void AudioPolicyManagerFuzzerWithConfigurationFile::traverseAndFuzzXML(xmlDocPtr pDoc,
421 xmlNodePtr curr) {
422 if (curr == nullptr) {
423 return;
424 }
425
426 xmlAttr *attribute = curr->properties;
427 while (attribute) {
428 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("format"))) {
429 const char *newFormat =
430 audio_format_to_string(getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
431 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newFormat));
432 }
433 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("flags"))) {
434 std::string newFlag = "";
435 uint16_t numFlags = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
436 for (uint16_t i = 0; i < numFlags; ++i) {
437 newFlag += std::string(audio_output_flag_to_string(
438 getValueFromVector<audio_output_flags_t>(mFdp, kAudioOutputFlags)));
439 if (i != (numFlags - 1)) {
440 newFlag += std::string("|");
441 }
442 }
443 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newFlag.c_str()));
444 }
445 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("samplingRates"))) {
446 std::string newRate = "";
447 uint16_t numRates = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
448 for (uint16_t i = 0; i < numRates; ++i) {
449 newRate += std::to_string(getValueFromVector<uint32_t>(mFdp, kSamplingRates));
450 if (i != (numRates - 1)) {
451 newRate += std::string(",");
452 }
453 }
454 xmlSetProp(curr, attribute->name, reinterpret_cast<const xmlChar *>(newRate.c_str()));
455 }
456 if (!xmlStrcmp(attribute->name, reinterpret_cast<const xmlChar *>("channelMasks"))) {
457 int isOutMask = -1;
458 char *value =
459 reinterpret_cast<char *>(xmlNodeListGetString(pDoc, attribute->children, 1));
460 if (std::string(value).find(std::string("_OUT_")) != std::string::npos) {
461 // OUT mask
462 isOutMask = 1;
463 } else if (std::string(value).find(std::string("_IN_")) != std::string::npos) {
464 // IN mask
465 isOutMask = 0;
466 }
467 if (isOutMask != -1) {
468 std::string newMask = "";
469 uint16_t numMasks = std::max((uint16_t)1, mFdp->ConsumeIntegral<uint16_t>());
470 for (uint16_t i = 0; i < numMasks; ++i) {
471 if (isOutMask) {
472 newMask += std::string(audio_channel_out_mask_to_string(
473 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks)));
474 } else {
475 newMask += std::string(audio_channel_in_mask_to_string(
476 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks)));
477 }
478 if (i != (numMasks - 1)) {
479 newMask += std::string(",");
480 }
481 }
482 xmlSetProp(curr, attribute->name,
483 reinterpret_cast<const xmlChar *>(newMask.c_str()));
484 }
485 xmlFree(value);
486 }
487 attribute = attribute->next;
488 }
489
490 curr = curr->xmlChildrenNode;
491 while (curr != nullptr) {
492 traverseAndFuzzXML(pDoc, curr);
493 curr = curr->next;
494 }
495}
496
497std::string AudioPolicyManagerFuzzerWithConfigurationFile::fuzzXML(std::string xmlPath) {
498 std::string outPath = sFuzzedConfig;
499
500 // Load in the xml file from disk
501 xmlDocPtr pDoc = xmlParseFile(xmlPath.c_str());
502 xmlNodePtr root = xmlDocGetRootElement(pDoc);
503
504 traverseAndFuzzXML(pDoc, root);
505
506 // Save the document back out to disk.
507 xmlSaveFileEnc(outPath.c_str(), pDoc, "UTF-8");
508 xmlFreeDoc(pDoc);
509
510 return outPath;
511}
512
513class AudioPolicyManagerFuzzerMsd : public AudioPolicyManagerFuzzerWithConfigurationFile {
514 public:
515 explicit AudioPolicyManagerFuzzerMsd(FuzzedDataProvider *fdp)
516 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp) {}
517
518 protected:
519 std::string getConfigFile() override;
520
521 static inline const std::string sMsdConfig =
522 sExecutableDir + "data/test_audio_policy_msd_configuration.xml";
523};
524
525std::string AudioPolicyManagerFuzzerMsd::getConfigFile() { return fuzzXML(sMsdConfig); }
526
527using PolicyMixTuple = std::tuple<audio_usage_t, audio_source_t, uint32_t>;
528
529class AudioPolicyManagerFuzzerDynamicPolicy : public AudioPolicyManagerFuzzerWithConfigurationFile {
530 public:
531 explicit AudioPolicyManagerFuzzerDynamicPolicy(FuzzedDataProvider *fdp)
532 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
533 ~AudioPolicyManagerFuzzerDynamicPolicy() override;
534 void process() override;
535
536 protected:
537 status_t addPolicyMix(int mixType, int mixFlag, audio_devices_t deviceType,
538 std::string mixAddress, const audio_config_t &audioConfig,
539 const std::vector<PolicyMixTuple> &rules);
540 void clearPolicyMix();
541 void registerPolicyMixes();
542 void unregisterPolicyMixes();
543
544 Vector<AudioMix> mAudioMixes;
545 const std::string mMixAddress = "remote_submix_media";
546};
547
548AudioPolicyManagerFuzzerDynamicPolicy::~AudioPolicyManagerFuzzerDynamicPolicy() {
549 clearPolicyMix();
550}
551
552status_t AudioPolicyManagerFuzzerDynamicPolicy::addPolicyMix(
553 int mixType, int mixFlag, audio_devices_t deviceType, std::string mixAddress,
554 const audio_config_t &audioConfig, const std::vector<PolicyMixTuple> &rules) {
Jan Sebechlebskyd6c96012022-08-17 14:07:45 +0200555 std::vector<AudioMixMatchCriterion> myMixMatchCriteria;
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530556
Jan Sebechlebskyd6c96012022-08-17 14:07:45 +0200557 myMixMatchCriteria.reserve(rules.size());
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530558 for (const auto &rule : rules) {
Jan Sebechlebskyd6c96012022-08-17 14:07:45 +0200559 myMixMatchCriteria.push_back(
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530560 AudioMixMatchCriterion(std::get<0>(rule), std::get<1>(rule), std::get<2>(rule)));
561 }
562
563 AudioMix myAudioMix(myMixMatchCriteria, mixType, audioConfig, mixFlag,
564 String8(mixAddress.c_str()), 0);
565 myAudioMix.mDeviceType = deviceType;
566 // Clear mAudioMix before add new one to make sure we don't add already existing mixes.
567 mAudioMixes.clear();
568 mAudioMixes.add(myAudioMix);
569
570 // As the policy mixes registration may fail at some case,
571 // caller need to check the returned status.
572 status_t ret = mManager->registerPolicyMixes(mAudioMixes);
573 return ret;
574}
575
576void AudioPolicyManagerFuzzerDynamicPolicy::clearPolicyMix() {
577 if (mManager != nullptr) {
578 mManager->unregisterPolicyMixes(mAudioMixes);
579 }
580 mAudioMixes.clear();
581}
582
583void AudioPolicyManagerFuzzerDynamicPolicy::registerPolicyMixes() {
584 const uint32_t numPolicies = mFdp->ConsumeIntegralInRange<uint32_t>(1, MAX_MIXES_PER_POLICY);
585
586 for (int i = 0; i < numPolicies; ++i) {
587 audio_config_t audioConfig = AUDIO_CONFIG_INITIALIZER;
588 audioConfig.channel_mask = getValueFromVector<audio_channel_mask_t>(
589 mFdp, mFdp->ConsumeBool() ? kAudioChannelInMasks : kAudioChannelOutMasks);
590 audioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
591 audioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
592 addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
593 getValueFromVector<int>(mFdp, kMixRouteFlags),
594 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), "", audioConfig,
595 std::vector<PolicyMixTuple>());
596 }
597}
598
599void AudioPolicyManagerFuzzerDynamicPolicy::unregisterPolicyMixes() {
600 mManager->unregisterPolicyMixes(mAudioMixes);
601}
602
603void AudioPolicyManagerFuzzerDynamicPolicy::process() {
604 if (initialize()) {
605 registerPolicyMixes();
606 fuzzPatchCreation();
607 unregisterPolicyMixes();
608 }
609}
610
611class AudioPolicyManagerFuzzerDPNoRemoteSubmixModule
612 : public AudioPolicyManagerFuzzerDynamicPolicy {
613 public:
614 explicit AudioPolicyManagerFuzzerDPNoRemoteSubmixModule(FuzzedDataProvider *fdp)
615 : AudioPolicyManagerFuzzerDynamicPolicy(fdp){};
616
617 protected:
618 std::string getConfigFile() override;
619
620 static inline const std::string sPrimaryOnlyConfig =
621 sExecutableDir + "data/test_audio_policy_primary_only_configuration.xml";
622};
623
624std::string AudioPolicyManagerFuzzerDPNoRemoteSubmixModule::getConfigFile() {
625 return fuzzXML(sPrimaryOnlyConfig);
626}
627
628class AudioPolicyManagerFuzzerDPPlaybackReRouting : public AudioPolicyManagerFuzzerDynamicPolicy {
629 public:
630 explicit AudioPolicyManagerFuzzerDPPlaybackReRouting(FuzzedDataProvider *fdp);
631 ~AudioPolicyManagerFuzzerDPPlaybackReRouting() override;
632 void process() override;
633
634 protected:
635 bool initialize() override;
636 void playBackReRouting();
637
638 std::unique_ptr<RecordingActivityTracker> mTracker;
639
640 std::vector<PolicyMixTuple> mUsageRules = {
641 {AUDIO_USAGE_MEDIA, AUDIO_SOURCE_DEFAULT, RULE_MATCH_ATTRIBUTE_USAGE},
642 {AUDIO_USAGE_ALARM, AUDIO_SOURCE_DEFAULT, RULE_MATCH_ATTRIBUTE_USAGE}};
643
644 struct audio_port_v7 mInjectionPort;
645 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
646 audio_config_t mAudioConfig;
647};
648
649AudioPolicyManagerFuzzerDPPlaybackReRouting::AudioPolicyManagerFuzzerDPPlaybackReRouting(
650 FuzzedDataProvider *fdp)
651 : AudioPolicyManagerFuzzerDynamicPolicy(fdp) {
652 const uint32_t numRules = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
653 for (int i = 0; i < numRules; ++i) {
654 PolicyMixTuple rule = {getValueFromVector<audio_usage_t>(mFdp, kAudioUsages),
655 getValueFromVector<audio_source_t>(mFdp, kAudioSources),
656 RULE_MATCH_ATTRIBUTE_USAGE};
657 mUsageRules.push_back(rule);
658 }
659}
660
661AudioPolicyManagerFuzzerDPPlaybackReRouting::~AudioPolicyManagerFuzzerDPPlaybackReRouting() {
662 mManager->stopInput(mPortId);
663}
664
665bool AudioPolicyManagerFuzzerDPPlaybackReRouting::initialize() {
Mufaddal Chakera5d9a9e02021-02-16 14:18:54 +0530666 if (!AudioPolicyManagerFuzzerDynamicPolicy::initialize()) {
667 return false;
668 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530669 mTracker.reset(new RecordingActivityTracker());
670
671 mAudioConfig = AUDIO_CONFIG_INITIALIZER;
672 mAudioConfig.channel_mask =
673 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks);
674 mAudioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
675 mAudioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
676 status_t ret = addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
677 getValueFromVector<int>(mFdp, kMixRouteFlags),
678 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
679 mMixAddress, mAudioConfig, mUsageRules);
680 if (ret != NO_ERROR) {
681 return false;
682 }
683
684 struct audio_port_v7 extractionPort;
685 findDevicePort(AUDIO_PORT_ROLE_SOURCE, getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
686 mMixAddress, &extractionPort);
687
688 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
689 audio_source_t source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
690 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, source,
691 AUDIO_FLAG_NONE, ""};
692 std::string tags = "addr=" + mMixAddress;
693 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
694 getInputForAttr(attr, mTracker->getRiid(), &selectedDeviceId, mAudioConfig.format,
695 mAudioConfig.channel_mask, mAudioConfig.sample_rate, AUDIO_INPUT_FLAG_NONE,
696 &mPortId);
697
698 ret = mManager->startInput(mPortId);
699 if (ret != NO_ERROR) {
700 return false;
701 }
702 if (!findDevicePort(AUDIO_PORT_ROLE_SINK,
703 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), mMixAddress,
704 &mInjectionPort)) {
705 return false;
706 }
707
708 return true;
709}
710
711void AudioPolicyManagerFuzzerDPPlaybackReRouting::playBackReRouting() {
712 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
713 for (int i = 0; i < numTestCases; ++i) {
714 audio_attributes_t attr;
715 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
716 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
717 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
718 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
719 std::string tags(mFdp->ConsumeBool() ? "" : "addr=remote_submix_media");
720 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
721
722 audio_port_handle_t playbackRoutedPortId = AUDIO_PORT_HANDLE_NONE;
723 getOutputForAttr(&playbackRoutedPortId, mAudioConfig.format, mAudioConfig.channel_mask,
724 mAudioConfig.sample_rate, AUDIO_OUTPUT_FLAG_NONE, nullptr /*output*/,
725 nullptr /*portId*/, attr);
726 }
727}
728
729void AudioPolicyManagerFuzzerDPPlaybackReRouting::process() {
730 if (initialize()) {
731 playBackReRouting();
732 registerPolicyMixes();
733 fuzzPatchCreation();
734 unregisterPolicyMixes();
735 }
736}
737
738class AudioPolicyManagerFuzzerDPMixRecordInjection : public AudioPolicyManagerFuzzerDynamicPolicy {
739 public:
740 explicit AudioPolicyManagerFuzzerDPMixRecordInjection(FuzzedDataProvider *fdp);
741 ~AudioPolicyManagerFuzzerDPMixRecordInjection() override;
742 void process() override;
743
744 protected:
745 bool initialize() override;
746 void recordingInjection();
747
748 std::unique_ptr<RecordingActivityTracker> mTracker;
749
750 std::vector<PolicyMixTuple> mSourceRules = {
751 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_CAMCORDER, RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET},
752 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_MIC, RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET},
753 {AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_VOICE_COMMUNICATION,
754 RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET}};
755
756 struct audio_port_v7 mExtractionPort;
757 audio_port_handle_t mPortId = AUDIO_PORT_HANDLE_NONE;
758 audio_config_t mAudioConfig;
759};
760
761AudioPolicyManagerFuzzerDPMixRecordInjection::AudioPolicyManagerFuzzerDPMixRecordInjection(
762 FuzzedDataProvider *fdp)
763 : AudioPolicyManagerFuzzerDynamicPolicy(fdp) {
764 const uint32_t numRules = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
765 for (int i = 0; i < numRules; ++i) {
766 PolicyMixTuple rule = {getValueFromVector<audio_usage_t>(mFdp, kAudioUsages),
767 getValueFromVector<audio_source_t>(mFdp, kAudioSources),
768 RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET};
769 mSourceRules.push_back(rule);
770 }
771}
772
773AudioPolicyManagerFuzzerDPMixRecordInjection::~AudioPolicyManagerFuzzerDPMixRecordInjection() {
774 mManager->stopOutput(mPortId);
775}
776
777bool AudioPolicyManagerFuzzerDPMixRecordInjection::initialize() {
Mufaddal Chakera5d9a9e02021-02-16 14:18:54 +0530778 if (!AudioPolicyManagerFuzzerDynamicPolicy::initialize()) {
779 return false;
780 }
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530781
782 mTracker.reset(new RecordingActivityTracker());
783
784 mAudioConfig = AUDIO_CONFIG_INITIALIZER;
785 mAudioConfig.channel_mask =
786 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks);
787 mAudioConfig.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
788 mAudioConfig.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
789 status_t ret = addPolicyMix(getValueFromVector<int>(mFdp, kMixTypes),
790 getValueFromVector<int>(mFdp, kMixRouteFlags),
791 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
792 mMixAddress, mAudioConfig, mSourceRules);
793 if (ret != NO_ERROR) {
794 return false;
795 }
796
797 struct audio_port_v7 injectionPort;
798 findDevicePort(AUDIO_PORT_ROLE_SINK, getValueFromVector<audio_devices_t>(mFdp, kAudioDevices),
799 mMixAddress, &injectionPort);
800
801 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
802 audio_usage_t usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
803 audio_attributes_t attr = {AUDIO_CONTENT_TYPE_UNKNOWN, usage, AUDIO_SOURCE_DEFAULT,
804 AUDIO_FLAG_NONE, ""};
805 std::string tags = std::string("addr=") + mMixAddress;
806 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
807 getOutputForAttr(&selectedDeviceId, mAudioConfig.format, mAudioConfig.channel_mask,
808 mAudioConfig.sample_rate /*sampleRate*/, AUDIO_OUTPUT_FLAG_NONE,
809 nullptr /*output*/, &mPortId, attr);
810 ret = mManager->startOutput(mPortId);
811 if (ret != NO_ERROR) {
812 return false;
813 }
814 getDeviceIdFromPatch(mClient->getLastAddedPatch());
815 if (!findDevicePort(AUDIO_PORT_ROLE_SOURCE,
816 getValueFromVector<audio_devices_t>(mFdp, kAudioDevices), mMixAddress,
817 &mExtractionPort)) {
818 return false;
819 }
820
821 return true;
822}
823
824void AudioPolicyManagerFuzzerDPMixRecordInjection::recordingInjection() {
825 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
826 for (int i = 0; i < numTestCases; ++i) {
827 audio_attributes_t attr;
828 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
829 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
830 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
831 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
832 std::string tags(mFdp->ConsumeBool() ? "" : "addr=remote_submix_media");
833 strncpy(attr.tags, tags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
834
835 audio_port_handle_t captureRoutedPortId = AUDIO_PORT_HANDLE_NONE;
836 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
837 getInputForAttr(attr, mTracker->getRiid(), &captureRoutedPortId, mAudioConfig.format,
838 mAudioConfig.channel_mask, mAudioConfig.sample_rate, AUDIO_INPUT_FLAG_NONE,
839 &portId);
840 }
841}
842
843void AudioPolicyManagerFuzzerDPMixRecordInjection::process() {
844 if (initialize()) {
845 recordingInjection();
846 registerPolicyMixes();
847 fuzzPatchCreation();
848 unregisterPolicyMixes();
849 }
850}
851
852using DeviceConnectionTestParams =
853 std::tuple<audio_devices_t /*type*/, std::string /*name*/, std::string /*address*/>;
854
855class AudioPolicyManagerFuzzerDeviceConnection
856 : public AudioPolicyManagerFuzzerWithConfigurationFile {
857 public:
858 explicit AudioPolicyManagerFuzzerDeviceConnection(FuzzedDataProvider *fdp)
859 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
860 void process() override;
861
jiabin2b9d5a12021-12-10 01:06:29 +0000862 void fuzzGetDirectPlaybackSupport();
Dorin Drimusf2196d82022-01-03 12:11:18 +0100863 void fuzzGetDirectProfilesForAttributes();
jiabin2b9d5a12021-12-10 01:06:29 +0000864
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530865 protected:
866 void setDeviceConnectionState();
867 void explicitlyRoutingAfterConnection();
868};
869
870void AudioPolicyManagerFuzzerDeviceConnection::setDeviceConnectionState() {
871 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
872 for (int i = 0; i < numTestCases; ++i) {
873 const audio_devices_t type = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
874 const std::string name = mFdp->ConsumeRandomLengthString();
875 const std::string address = mFdp->ConsumeRandomLengthString();
876 mManager->setDeviceConnectionState(
877 type, getValueFromVector<audio_policy_dev_state_t>(mFdp, kAudioPolicyDeviceStates),
878 address.c_str(), name.c_str(), getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
879 }
880}
881
882void AudioPolicyManagerFuzzerDeviceConnection::explicitlyRoutingAfterConnection() {
883 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
884 for (int i = 0; i < numTestCases; ++i) {
885 const audio_devices_t type = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
886 const std::string name = mFdp->ConsumeRandomLengthString();
887 const std::string address = mFdp->ConsumeRandomLengthString();
888 mManager->setDeviceConnectionState(
889 type, getValueFromVector<audio_policy_dev_state_t>(mFdp, kAudioPolicyDeviceStates),
890 address.c_str(), name.c_str(), getValueFromVector<audio_format_t>(mFdp, kAudioFormats));
891
892 audio_port_v7 devicePort;
893 const audio_port_role_t role =
894 audio_is_output_device(type) ? AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
895 findDevicePort(role, type, address, &devicePort);
896
897 audio_port_handle_t routedPortId = devicePort.id;
898 // Try start input or output according to the device type
899 if (audio_is_output_devices(type)) {
900 getOutputForAttr(&routedPortId, getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
901 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks),
902 getValueFromVector<uint32_t>(mFdp, kSamplingRates),
903 AUDIO_OUTPUT_FLAG_NONE);
904 } else if (audio_is_input_device(type)) {
905 RecordingActivityTracker tracker;
906 getInputForAttr({}, tracker.getRiid(), &routedPortId,
907 getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
908 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelInMasks),
909 getValueFromVector<uint32_t>(mFdp, kSamplingRates),
910 AUDIO_INPUT_FLAG_NONE);
911 }
912 }
913}
914
jiabin2b9d5a12021-12-10 01:06:29 +0000915void AudioPolicyManagerFuzzerDeviceConnection::fuzzGetDirectPlaybackSupport() {
916 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
917 for (int i = 0; i < numTestCases; ++i) {
918 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
919 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
920 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
921 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
922 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
923 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
924 config.channel_mask = getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks);
925 config.format = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
926 config.sample_rate = getValueFromVector<uint32_t>(mFdp, kSamplingRates);
927 mManager->getDirectPlaybackSupport(&attr, &config);
928 }
929}
930
Dorin Drimusf2196d82022-01-03 12:11:18 +0100931void AudioPolicyManagerFuzzerDeviceConnection::fuzzGetDirectProfilesForAttributes() {
932 const uint32_t numTestCases = mFdp->ConsumeIntegralInRange<uint32_t>(1, 10);
933 for (int i = 0; i < numTestCases; ++i) {
934 AudioProfileVector audioProfiles;
935 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
936 attr.content_type = getValueFromVector<audio_content_type_t>(mFdp, kAudioContentTypes);
937 attr.usage = getValueFromVector<audio_usage_t>(mFdp, kAudioUsages);
938 attr.source = getValueFromVector<audio_source_t>(mFdp, kAudioSources);
939 attr.flags = getValueFromVector<audio_flags_mask_t>(mFdp, kAudioFlagMasks);
940 mManager->getDirectProfilesForAttributes(&attr, audioProfiles);
941 }
942}
943
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530944void AudioPolicyManagerFuzzerDeviceConnection::process() {
945 if (initialize()) {
946 setDeviceConnectionState();
947 explicitlyRoutingAfterConnection();
jiabin2b9d5a12021-12-10 01:06:29 +0000948 fuzzGetDirectPlaybackSupport();
Dorin Drimusf2196d82022-01-03 12:11:18 +0100949 fuzzGetDirectProfilesForAttributes();
Mufaddal Chakera253887f2020-12-09 17:17:37 +0530950 fuzzPatchCreation();
951 }
952}
953
954class AudioPolicyManagerTVFuzzer : public AudioPolicyManagerFuzzerWithConfigurationFile {
955 public:
956 explicit AudioPolicyManagerTVFuzzer(FuzzedDataProvider *fdp)
957 : AudioPolicyManagerFuzzerWithConfigurationFile(fdp){};
958 void process() override;
959
960 protected:
961 std::string getConfigFile();
962 void testHDMIPortSelection(audio_output_flags_t flags);
963
964 static inline const std::string sTvConfig =
965 AudioPolicyManagerTVFuzzer::sExecutableDir + "data/test_tv_apm_configuration.xml";
966};
967
968std::string AudioPolicyManagerTVFuzzer::getConfigFile() { return fuzzXML(sTvConfig); }
969
970void AudioPolicyManagerTVFuzzer::testHDMIPortSelection(audio_output_flags_t flags) {
971 audio_devices_t audioDevice = getValueFromVector<audio_devices_t>(mFdp, kAudioDevices);
972 audio_format_t audioFormat = getValueFromVector<audio_format_t>(mFdp, kAudioFormats);
973 status_t ret = mManager->setDeviceConnectionState(
974 audioDevice, AUDIO_POLICY_DEVICE_STATE_AVAILABLE, "" /*address*/, "" /*name*/, audioFormat);
975 if (ret != NO_ERROR) {
976 return;
977 }
978 audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
979 audio_io_handle_t output;
980 audio_port_handle_t portId;
981 getOutputForAttr(&selectedDeviceId, getValueFromVector<audio_format_t>(mFdp, kAudioFormats),
982 getValueFromVector<audio_channel_mask_t>(mFdp, kAudioChannelOutMasks),
983 getValueFromVector<uint32_t>(mFdp, kSamplingRates), flags, &output, &portId);
984 sp<SwAudioOutputDescriptor> outDesc = mManager->getOutputs().valueFor(output);
985 if (outDesc.get() == nullptr) {
986 return;
987 }
988 audio_port_v7 port = {};
989 outDesc->toAudioPort(&port);
990 mManager->releaseOutput(portId);
991 mManager->setDeviceConnectionState(audioDevice, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
992 "" /*address*/, "" /*name*/, audioFormat);
993}
994
995void AudioPolicyManagerTVFuzzer::process() {
996 if (initialize()) {
997 testHDMIPortSelection(getValueFromVector<audio_output_flags_t>(mFdp, kAudioOutputFlags));
998 fuzzPatchCreation();
999 }
1000}
1001
1002extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
1003 if (size < 1) {
1004 return 0;
1005 }
1006 FuzzedDataProvider fdp = FuzzedDataProvider(data, size);
1007 while (fdp.remaining_bytes() > 0) {
1008 AudioPolicyManagerFuzzer audioPolicyManagerFuzzer(&fdp);
1009 audioPolicyManagerFuzzer.process();
1010
1011 AudioPolicyManagerFuzzerMsd audioPolicyManagerFuzzerMsd(&fdp);
1012 audioPolicyManagerFuzzerMsd.process();
1013
1014 AudioPolicyManagerFuzzerWithConfigurationFile audioPolicyManagerFuzzerWithConfigurationFile(
1015 &fdp);
1016 audioPolicyManagerFuzzerWithConfigurationFile.process();
1017
1018 AudioPolicyManagerFuzzerDynamicPolicy audioPolicyManagerFuzzerDynamicPolicy(&fdp);
1019 audioPolicyManagerFuzzerDynamicPolicy.process();
1020
1021 AudioPolicyManagerFuzzerDPNoRemoteSubmixModule
1022 audioPolicyManagerFuzzerDPNoRemoteSubmixModule(&fdp);
1023 audioPolicyManagerFuzzerDPNoRemoteSubmixModule.process();
1024
1025 AudioPolicyManagerFuzzerDPPlaybackReRouting audioPolicyManagerFuzzerDPPlaybackReRouting(
1026 &fdp);
1027 audioPolicyManagerFuzzerDPPlaybackReRouting.process();
1028
1029 AudioPolicyManagerFuzzerDPMixRecordInjection audioPolicyManagerFuzzerDPMixRecordInjection(
1030 &fdp);
1031 audioPolicyManagerFuzzerDPMixRecordInjection.process();
1032
1033 AudioPolicyManagerFuzzerDeviceConnection audioPolicyManagerFuzzerDeviceConnection(&fdp);
1034 audioPolicyManagerFuzzerDeviceConnection.process();
1035
1036 AudioPolicyManagerTVFuzzer audioPolicyManagerTVFuzzer(&fdp);
1037 audioPolicyManagerTVFuzzer.process();
1038 }
1039 return 0;
1040}