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