An unknown root cause made data look like events (0xdb) with very long event lengths. This was causing very long printouts of bogus stuff in the console. While the root cause needs to be found and fixed, there is no need of parsing events with abnormal lengths. Also stop parsing if length exceeds the end of scope. Signed-off-by: Christian Melki <christian.melki@xxxxxxxxxx> --- drivers/hab/habv4.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/hab/habv4.c b/drivers/hab/habv4.c index f74de009fc..1a55a3e448 100644 --- a/drivers/hab/habv4.c +++ b/drivers/hab/habv4.c @@ -203,6 +203,8 @@ static uint32_t hab_sip_get_version(void) return (uint32_t)res.a0; } +#define HABV4_EVENT_MAX_LEN 0x80 + #define IMX8MQ_ROM_OCRAM_ADDRESS 0x9061C0 #define IMX8MM_ROM_OCRAM_ADDRESS 0x908040 #define IMX8MN_ROM_OCRAM_ADDRESS 0x908040 @@ -217,6 +219,7 @@ static enum hab_status imx8m_read_sram_events(enum hab_status status, char *sram; int i = 0; int internal_index = 0; + uint16_t ev_len; char *end = 0; struct hab_event_record *search; @@ -236,13 +239,21 @@ static enum hab_status imx8m_read_sram_events(enum hab_status status, * recommends the address and size, however errors are usually contained * within the first bytes. Scan only the first few bytes to rule out * lots of false positives. + * The max event length is just a sanity check. */ - end = sram + 0x1a0; + end = sram + 0x1a0; while (sram < end) { if (*sram == 0xdb) { search = (void *)sram; - sram = sram + be16_to_cpu(search->hdr.len); + ev_len = be16_to_cpu(search->hdr.len); + if (ev_len > HABV4_EVENT_MAX_LEN) { + break; + } + sram += ev_len; + if (sram > end) { + break; + } events[num_events] = search; num_events++; } else { -- 2.34.1