From f90036285d193c6903fe8c2ffc4b27ae40701c2d Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Tue, 10 Mar 2020 13:15:08 -0700 Subject: [PATCH] audiopolicy: Remove global static initializers Replace global static instances of non-primitive types with function static instances. The latter get initialized on the first call to the function instead of module load time. This also gets rid of ASAN UAF errors reported during unit test execution. Bug: 150649241 Test: atest audiopolicy_tests Test: atest audio_health_tests (for ASAN-instrumented libraries and test) Change-Id: I514c9205b9d3e7a3f0a1d8aa71d71fcc792e7a7b --- .../src/AudioOutputDescriptor.cpp | 9 +++-- .../audiopolicy/enginedefault/src/Engine.cpp | 34 +++++++++++-------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp index dd516581c2..aaa28bceed 100644 --- a/services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +++ b/services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp @@ -33,7 +33,10 @@ namespace android { -DeviceTypeSet APM_AUDIO_OUT_DEVICE_REMOTE_ALL = {AUDIO_DEVICE_OUT_REMOTE_SUBMIX}; +static const DeviceTypeSet& getAllOutRemoteDevices() { + static const DeviceTypeSet allOutRemoteDevices = {AUDIO_DEVICE_OUT_REMOTE_SUBMIX}; + return allOutRemoteDevices; +} AudioOutputDescriptor::AudioOutputDescriptor(const sp& policyAudioPort, AudioPolicyClientInterface *clientInterface) @@ -681,7 +684,7 @@ bool SwAudioOutputCollection::isActiveLocally(VolumeSource volumeSource, uint32_ const sp outputDesc = this->valueAt(i); if (outputDesc->isActive(volumeSource, inPastMs, sysTime) && (!(outputDesc->devices() - .containsDeviceAmongTypes(APM_AUDIO_OUT_DEVICE_REMOTE_ALL)))) { + .containsDeviceAmongTypes(getAllOutRemoteDevices())))) { return true; } } @@ -693,7 +696,7 @@ bool SwAudioOutputCollection::isActiveRemotely(VolumeSource volumeSource, uint32 nsecs_t sysTime = systemTime(); for (size_t i = 0; i < size(); i++) { const sp outputDesc = valueAt(i); - if (outputDesc->devices().containsDeviceAmongTypes(APM_AUDIO_OUT_DEVICE_REMOTE_ALL) && + if (outputDesc->devices().containsDeviceAmongTypes(getAllOutRemoteDevices()) && outputDesc->isActive(volumeSource, inPastMs, sysTime)) { // do not consider re routing (when the output is going to a dynamic policy) // as "remote playback" diff --git a/services/audiopolicy/enginedefault/src/Engine.cpp b/services/audiopolicy/enginedefault/src/Engine.cpp index a7d7cf6f05..b14d2bbb0b 100755 --- a/services/audiopolicy/enginedefault/src/Engine.cpp +++ b/services/audiopolicy/enginedefault/src/Engine.cpp @@ -41,20 +41,23 @@ namespace audio_policy { struct legacy_strategy_map { const char *name; legacy_strategy id; }; -static const std::vector gLegacyStrategy = { - { "STRATEGY_NONE", STRATEGY_NONE }, - { "STRATEGY_MEDIA", STRATEGY_MEDIA }, - { "STRATEGY_PHONE", STRATEGY_PHONE }, - { "STRATEGY_SONIFICATION", STRATEGY_SONIFICATION }, - { "STRATEGY_SONIFICATION_RESPECTFUL", STRATEGY_SONIFICATION_RESPECTFUL }, - { "STRATEGY_DTMF", STRATEGY_DTMF }, - { "STRATEGY_ENFORCED_AUDIBLE", STRATEGY_ENFORCED_AUDIBLE }, - { "STRATEGY_TRANSMITTED_THROUGH_SPEAKER", STRATEGY_TRANSMITTED_THROUGH_SPEAKER }, - { "STRATEGY_ACCESSIBILITY", STRATEGY_ACCESSIBILITY }, - { "STRATEGY_REROUTING", STRATEGY_REROUTING }, - { "STRATEGY_PATCH", STRATEGY_REROUTING }, // boiler to manage stream patch volume - { "STRATEGY_CALL_ASSISTANT", STRATEGY_CALL_ASSISTANT }, -}; +static const std::vector& getLegacyStrategy() { + static const std::vector legacyStrategy = { + { "STRATEGY_NONE", STRATEGY_NONE }, + { "STRATEGY_MEDIA", STRATEGY_MEDIA }, + { "STRATEGY_PHONE", STRATEGY_PHONE }, + { "STRATEGY_SONIFICATION", STRATEGY_SONIFICATION }, + { "STRATEGY_SONIFICATION_RESPECTFUL", STRATEGY_SONIFICATION_RESPECTFUL }, + { "STRATEGY_DTMF", STRATEGY_DTMF }, + { "STRATEGY_ENFORCED_AUDIBLE", STRATEGY_ENFORCED_AUDIBLE }, + { "STRATEGY_TRANSMITTED_THROUGH_SPEAKER", STRATEGY_TRANSMITTED_THROUGH_SPEAKER }, + { "STRATEGY_ACCESSIBILITY", STRATEGY_ACCESSIBILITY }, + { "STRATEGY_REROUTING", STRATEGY_REROUTING }, + { "STRATEGY_PATCH", STRATEGY_REROUTING }, // boiler to manage stream patch volume + { "STRATEGY_CALL_ASSISTANT", STRATEGY_CALL_ASSISTANT }, + }; + return legacyStrategy; +} Engine::Engine() { @@ -63,7 +66,8 @@ Engine::Engine() "Policy Engine configuration is partially invalid, skipped %zu elements", result.nbSkippedElement); - for (const auto &strategy : gLegacyStrategy) { + auto legacyStrategy = getLegacyStrategy(); + for (const auto &strategy : legacyStrategy) { mLegacyStrategyMap[getProductStrategyByName(strategy.name)] = strategy.id; } }