diff --git a/firmware/controllers/core/error_handling.cpp b/firmware/controllers/core/error_handling.cpp index 9cf415bfd4..44ff794ad6 100644 --- a/firmware/controllers/core/error_handling.cpp +++ b/firmware/controllers/core/error_handling.cpp @@ -89,19 +89,27 @@ void chDbgPanic3(const char *msg, const char * file, int line) { // todo: look into chsnprintf // todo: move to some util file & reuse for 'firmwareError' method -static void printToStream(MemoryStream *stream, const char *fmt, va_list ap) { +/** + * @returns number of buffer bytes used + */ +static int printToStream(MemoryStream *stream, const char *fmt, va_list ap) { stream->eos = 0; // reset chvprintf((BaseSequentialStream *) stream, fmt, ap); stream->buffer[stream->eos] = 0; + return stream->eos + 1; } -static void printWarning(const char *fmt, va_list ap) { +static void printWarning(obd_code_e code, const char *fmt, va_list ap) { resetLogging(&logger); // todo: is 'reset' really needed here? appendMsgPrefix(&logger); logger.append(WARNING_PREFIX); - printToStream(&warningStream, fmt, ap); + int bufferUsage = printToStream(&warningStream, fmt, ap); + if (bufferUsage > WARNING_BUFFER_SIZE) { + firmwareError(CUSTOM_ERR_ASSERT, "stream overrun with %d", code); + return; + } logger.append(warningBuffer); append(&logger, DELIMETER); @@ -141,7 +149,7 @@ bool warning(obd_code_e code, const char *fmt, ...) { va_list ap; va_start(ap, fmt); - printWarning(fmt, ap); + printWarning(code, fmt, ap); va_end(ap); #else // todo: we need access to 'engine' here so that we can migrate to real 'engine->engineState.warnings' @@ -217,7 +225,7 @@ void firmwareError(obd_code_e code, const char *fmt, ...) { #ifdef EFI_PRINT_ERRORS_AS_WARNINGS va_list ap; va_start(ap, fmt); - printWarning(fmt, ap); + printWarning(code, fmt, ap); va_end(ap); #endif ON_FATAL_ERROR()