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

Commit 5df3493d authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Validate axes and led labels correctly

Before this CL, a number of checks for kl file validity were incorrect.
Some of the APIs were supposed to return an invalid value, but instead
were always returning a valid value, no matter what the input was.

Correct these values by switching to std::optional.

Bug: 266400536
Test: m libinput_tests && adb sync data && adb shell -t /data/nativetest64/libinput_tests/libinput_tests
Change-Id: I4ef45f3249dca4f4f033fb85e9fecbc2ad1f1395
parent 0026b4cf
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -529,7 +529,7 @@ public:
    inline nsecs_t getEventTime() const { return mEventTime; }

    static const char* getLabel(int32_t keyCode);
    static int32_t getKeyCodeFromLabel(const char* label);
    static std::optional<int> getKeyCodeFromLabel(const char* label);

    void initialize(int32_t id, int32_t deviceId, uint32_t source, int32_t displayId,
                    std::array<uint8_t, 32> hmac, int32_t action, int32_t flags, int32_t keyCode,
@@ -842,7 +842,7 @@ public:
    }

    static const char* getLabel(int32_t axis);
    static int32_t getAxisFromLabel(const char* label);
    static std::optional<int> getAxisFromLabel(const char* label);

    static std::string actionToString(int32_t action);

+6 −6
Original line number Diff line number Diff line
@@ -35,22 +35,22 @@ struct InputEventLabel {

class InputEventLookup {
public:
    static int lookupValueByLabel(const std::unordered_map<std::string, int>& map,
    static std::optional<int> lookupValueByLabel(const std::unordered_map<std::string, int>& map,
                                                 const char* literal);

    static const char* lookupLabelByValue(const std::vector<InputEventLabel>& vec, int value);

    static int32_t getKeyCodeByLabel(const char* label);
    static std::optional<int> getKeyCodeByLabel(const char* label);

    static const char* getLabelByKeyCode(int32_t keyCode);

    static uint32_t getKeyFlagByLabel(const char* label);
    static std::optional<int> getKeyFlagByLabel(const char* label);

    static int32_t getAxisByLabel(const char* label);
    static std::optional<int> getAxisByLabel(const char* label);

    static const char* getAxisLabel(int32_t axisId);

    static int32_t getLedByLabel(const char* label);
    static std::optional<int> getLedByLabel(const char* label);

private:
    static const std::unordered_map<std::string, int> KEYCODES;
+2 −2
Original line number Diff line number Diff line
@@ -299,7 +299,7 @@ const char* KeyEvent::getLabel(int32_t keyCode) {
    return InputEventLookup::getLabelByKeyCode(keyCode);
}

int32_t KeyEvent::getKeyCodeFromLabel(const char* label) {
std::optional<int> KeyEvent::getKeyCodeFromLabel(const char* label) {
    return InputEventLookup::getKeyCodeByLabel(label);
}

@@ -891,7 +891,7 @@ const char* MotionEvent::getLabel(int32_t axis) {
    return InputEventLookup::getAxisLabel(axis);
}

int32_t MotionEvent::getAxisFromLabel(const char* label) {
std::optional<int> MotionEvent::getAxisFromLabel(const char* label) {
    return InputEventLookup::getAxisByLabel(label);
}

+11 −11
Original line number Diff line number Diff line
@@ -438,11 +438,11 @@ const std::unordered_map<std::string, int> InputEventLookup::LEDS = {LEDS_SEQUEN

const std::unordered_map<std::string, int> InputEventLookup::FLAGS = {FLAGS_SEQUENCE};

int InputEventLookup::lookupValueByLabel(const std::unordered_map<std::string, int>& map,
                                         const char* literal) {
std::optional<int> InputEventLookup::lookupValueByLabel(
        const std::unordered_map<std::string, int>& map, const char* literal) {
    std::string str(literal);
    auto it = map.find(str);
    return it != map.end() ? it->second : 0;
    return it != map.end() ? std::make_optional(it->second) : std::nullopt;
}

const char* InputEventLookup::lookupLabelByValue(const std::vector<InputEventLabel>& vec,
@@ -453,8 +453,8 @@ const char* InputEventLookup::lookupLabelByValue(const std::vector<InputEventLab
    return nullptr;
}

int32_t InputEventLookup::getKeyCodeByLabel(const char* label) {
    return int32_t(lookupValueByLabel(KEYCODES, label));
std::optional<int> InputEventLookup::getKeyCodeByLabel(const char* label) {
    return lookupValueByLabel(KEYCODES, label);
}

const char* InputEventLookup::getLabelByKeyCode(int32_t keyCode) {
@@ -464,20 +464,20 @@ const char* InputEventLookup::getLabelByKeyCode(int32_t keyCode) {
    return nullptr;
}

uint32_t InputEventLookup::getKeyFlagByLabel(const char* label) {
    return uint32_t(lookupValueByLabel(FLAGS, label));
std::optional<int> InputEventLookup::getKeyFlagByLabel(const char* label) {
    return lookupValueByLabel(FLAGS, label);
}

int32_t InputEventLookup::getAxisByLabel(const char* label) {
    return int32_t(lookupValueByLabel(AXES, label));
std::optional<int> InputEventLookup::getAxisByLabel(const char* label) {
    return lookupValueByLabel(AXES, label);
}

const char* InputEventLookup::getAxisLabel(int32_t axisId) {
    return lookupLabelByValue(AXES_NAMES, axisId);
}

int32_t InputEventLookup::getLedByLabel(const char* label) {
    return int32_t(lookupValueByLabel(LEDS, label));
std::optional<int> InputEventLookup::getLedByLabel(const char* label) {
    return lookupValueByLabel(LEDS, label);
}

} // namespace android
+11 −13
Original line number Diff line number Diff line
@@ -999,7 +999,7 @@ status_t KeyCharacterMap::Parser::parseMapKey() {

    mTokenizer->skipDelimiters(WHITESPACE);
    String8 keyCodeToken = mTokenizer->nextToken(WHITESPACE);
    int32_t keyCode = InputEventLookup::getKeyCodeByLabel(keyCodeToken.string());
    std::optional<int> keyCode = InputEventLookup::getKeyCodeByLabel(keyCodeToken.string());
    if (!keyCode) {
        ALOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(),
                keyCodeToken.string());
@@ -1010,19 +1010,19 @@ status_t KeyCharacterMap::Parser::parseMapKey() {
    ALOGD("Parsed map key %s: code=%d, keyCode=%d.",
            mapUsage ? "usage" : "scan code", code, keyCode);
#endif
    map.insert_or_assign(code, keyCode);
    map.insert_or_assign(code, *keyCode);
    return NO_ERROR;
}

status_t KeyCharacterMap::Parser::parseKey() {
    String8 keyCodeToken = mTokenizer->nextToken(WHITESPACE);
    int32_t keyCode = InputEventLookup::getKeyCodeByLabel(keyCodeToken.string());
    std::optional<int> keyCode = InputEventLookup::getKeyCodeByLabel(keyCodeToken.string());
    if (!keyCode) {
        ALOGE("%s: Expected key code label, got '%s'.", mTokenizer->getLocation().string(),
                keyCodeToken.string());
        return BAD_VALUE;
    }
    if (mMap->mKeys.indexOfKey(keyCode) >= 0) {
    if (mMap->mKeys.indexOfKey(*keyCode) >= 0) {
        ALOGE("%s: Duplicate entry for key code '%s'.", mTokenizer->getLocation().string(),
                keyCodeToken.string());
        return BAD_VALUE;
@@ -1036,11 +1036,9 @@ status_t KeyCharacterMap::Parser::parseKey() {
        return BAD_VALUE;
    }

#if DEBUG_PARSER
    ALOGD("Parsed beginning of key: keyCode=%d.", keyCode);
#endif
    mKeyCode = keyCode;
    mMap->mKeys.add(keyCode, new Key());
    ALOGD_IF(DEBUG_PARSER, "Parsed beginning of key: keyCode=%d.", *keyCode);
    mKeyCode = *keyCode;
    mMap->mKeys.add(*keyCode, new Key());
    mState = STATE_KEY;
    return NO_ERROR;
}
@@ -1136,7 +1134,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
            } else if (token == "fallback") {
                mTokenizer->skipDelimiters(WHITESPACE);
                token = mTokenizer->nextToken(WHITESPACE);
                int32_t keyCode = InputEventLookup::getKeyCodeByLabel(token.string());
                std::optional<int> keyCode = InputEventLookup::getKeyCodeByLabel(token.string());
                if (!keyCode) {
                    ALOGE("%s: Invalid key code label for fallback behavior, got '%s'.",
                            mTokenizer->getLocation().string(),
@@ -1148,12 +1146,12 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
                            mTokenizer->getLocation().string());
                    return BAD_VALUE;
                }
                behavior.fallbackKeyCode = keyCode;
                behavior.fallbackKeyCode = *keyCode;
                haveFallback = true;
            } else if (token == "replace") {
                mTokenizer->skipDelimiters(WHITESPACE);
                token = mTokenizer->nextToken(WHITESPACE);
                int32_t keyCode = InputEventLookup::getKeyCodeByLabel(token.string());
                std::optional<int> keyCode = InputEventLookup::getKeyCodeByLabel(token.string());
                if (!keyCode) {
                    ALOGE("%s: Invalid key code label for replace, got '%s'.",
                            mTokenizer->getLocation().string(),
@@ -1170,7 +1168,7 @@ status_t KeyCharacterMap::Parser::parseKeyProperty() {
                            mTokenizer->getLocation().string());
                    return BAD_VALUE;
                }
                behavior.replacementKeyCode = keyCode;
                behavior.replacementKeyCode = *keyCode;
                haveReplacement = true;

            } else {
Loading