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