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