Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9446570 authored by Shunkai Yao's avatar Shunkai Yao
Browse files

Equalizer presets negative index filter out and validation

Bug: 340810158
Bug: 346482292
Bug: 346907684
Test: atest CtsSecurityTestCases:android.security.cts.EffectBundleTest
Test: atest CtsMediaAudioTestCases:android.media.audio.cts.EqualizerTest
Change-Id: I224331e2f23e3f875ed86b793ddf8d99b7a2b0e6
parent f9e0df6c
Loading
Loading
Loading
Loading
+14 −2
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#include <cstdint>
#include <cstdint>
#include <cstring>
#include <cstring>
#include <optional>
#include <optional>
#include <unordered_set>
#define LOG_TAG "AidlConversionEQ"
#define LOG_TAG "AidlConversionEQ"
//#define LOG_NDEBUG 0
//#define LOG_NDEBUG 0


@@ -262,10 +263,21 @@ status_t AidlConversionEq::getParameter(EffectParamWriter& param) {
        }
        }
        case EQ_PARAM_GET_NUM_OF_PRESETS: {
        case EQ_PARAM_GET_NUM_OF_PRESETS: {
            Parameter aidlParam = VALUE_OR_RETURN_STATUS(getAidlParameter(Equalizer::presets));
            Parameter aidlParam = VALUE_OR_RETURN_STATUS(getAidlParameter(Equalizer::presets));
            const auto& presets = VALUE_OR_RETURN_STATUS(GET_PARAMETER_SPECIFIC_FIELD(
            auto presets = VALUE_OR_RETURN_STATUS(GET_PARAMETER_SPECIFIC_FIELD(
                    aidlParam, Equalizer, equalizer, Equalizer::presets,
                    aidlParam, Equalizer, equalizer, Equalizer::presets,
                    std::vector<Equalizer::Preset>));
                    std::vector<Equalizer::Preset>));
            uint16_t num = presets.size();
            // it was assumed the presets index in the range of [0, NUM_OF_PRESETS - 1], so
            // filter out presets out of this range (one example is preset {-1, "custom"})
            std::erase_if(presets, [](const auto& preset) { return preset.index < 0; });
            // validate remaining indexes are unique [0, num - 1]
            std::unordered_set<uint16_t> uniqueIndices;
            const uint16_t num = presets.size();
            for (const auto& preset : presets) {
                if (preset.index >= num || 0 != uniqueIndices.count(preset.index)) {
                    return BAD_VALUE;
                }
                uniqueIndices.insert(preset.index);
            }
            return param.writeToValue(&num);
            return param.writeToValue(&num);
        }
        }
        case EQ_PARAM_GET_PRESET_NAME: {
        case EQ_PARAM_GET_PRESET_NAME: {