diff --git a/firmware/console/eficonsole.cpp b/firmware/console/eficonsole.cpp index ece3a832c4..3c5e27f643 100644 --- a/firmware/console/eficonsole.cpp +++ b/firmware/console/eficonsole.cpp @@ -208,6 +208,10 @@ void onCliDuplicateError(const char *token) { firmwareError(ObdCode::CUSTOM_SAME_TWICE, "Same action twice [%s]", token); } +void onCliOverflowError() { + firmwareError(ObdCode::CUSTOM_CONSOLE_TOO_MANY, "Too many console actions"); +} + void initializeConsole() { initConsoleLogic(); diff --git a/firmware/util/cli_registry.cpp b/firmware/util/cli_registry.cpp index bc270c5f50..f85649ed75 100644 --- a/firmware/util/cli_registry.cpp +++ b/firmware/util/cli_registry.cpp @@ -14,9 +14,10 @@ * @author Andrey Belomutskiy, (c) 2012-2020 */ -#include "pch.h" #include #include +#include +#include #include "efiprintf.h" #include "efistringutil.h" #include "cli_registry.h" @@ -58,7 +59,11 @@ static void doAddAction(const char *token, action_type_e type, Void callback, vo } } - efiAssertVoid(ObdCode::CUSTOM_CONSOLE_TOO_MANY, consoleActionCount < CONSOLE_MAX_ACTIONS, "Too many console actions"); + if (consoleActionCount >= CONSOLE_MAX_ACTIONS) { + onCliOverflowError(); + return; + } + TokenCallback *current = &consoleActions[consoleActionCount++]; current->token = token; current->parameterType = type; diff --git a/firmware/util/cli_registry.h b/firmware/util/cli_registry.h index f4da7d9085..c120943a42 100644 --- a/firmware/util/cli_registry.h +++ b/firmware/util/cli_registry.h @@ -105,6 +105,7 @@ void addConsoleActionSSSSS(const char *token, VoidCharPtrCharPtrCharPtrCharPtrCh void onCliCaseError(const char *token); void onCliDuplicateError(const char *token); +void onCliOverflowError(); #ifdef __cplusplus } diff --git a/unit_tests/global_mocks.cpp b/unit_tests/global_mocks.cpp index d9da4f67f1..df4bd84d49 100644 --- a/unit_tests/global_mocks.cpp +++ b/unit_tests/global_mocks.cpp @@ -34,3 +34,5 @@ void onCliCaseError(const char *token) { void onCliDuplicateError(const char *token) { } +void onCliOverflowError() { +}