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