From 0b625fdb6afb37750c2b01221a3edb2cff32a1b9 Mon Sep 17 00:00:00 2001 From: Max Krummenacher Date: Tue, 20 Sep 2016 18:50:23 +0200 Subject: configblock: skip over tags marked invalid Skip over data which have the tag flag reporting invalid rather than abort parsing. Break parsing when the first tag id set to 0xffff is encountered or the maximum size of the config block is reached. Signed-off-by: Max Krummenacher Signed-off-by: Marcel Ziswiler --- board/toradex/common/configblock.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/board/toradex/common/configblock.c b/board/toradex/common/configblock.c index 9462d48ad0..f9a30df57a 100644 --- a/board/toradex/common/configblock.c +++ b/board/toradex/common/configblock.c @@ -22,6 +22,7 @@ DECLARE_GLOBAL_DATA_PTR; #define TAG_VALID 0xcf01 #define TAG_MAC 0x0000 #define TAG_HW 0x0008 +#define TAG_INVALID 0xffff #define TAG_FLAG_VALID 0x1 @@ -194,23 +195,25 @@ int read_trdx_cfg_block(void) valid_cfgblock = true; offset = 4; - while (true) { + while (offset < TRDX_CFG_BLOCK_MAX_SIZE) { tag = (struct toradex_tag *)(config_block + offset); offset += 4; - if (tag->flags != TAG_FLAG_VALID) + if (tag->id == TAG_INVALID) break; - switch (tag->id) - { - case TAG_MAC: - memcpy(&trdx_eth_addr, config_block + offset, 6); - - /* NIC part of MAC address is serial number */ - trdx_serial = ntohl(trdx_eth_addr.nic) >> 8; - break; - case TAG_HW: - memcpy(&trdx_hw_tag, config_block + offset, 8); - break; + if (tag->flags == TAG_FLAG_VALID) { + switch (tag->id) { + case TAG_MAC: + memcpy(&trdx_eth_addr, config_block + offset, + 6); + + /* NIC part of MAC address is serial number */ + trdx_serial = ntohl(trdx_eth_addr.nic) >> 8; + break; + case TAG_HW: + memcpy(&trdx_hw_tag, config_block + offset, 8); + break; + } } /* Get to next tag according to current tags length */ @@ -218,7 +221,8 @@ int read_trdx_cfg_block(void) } /* Cap product id to avoid issues with a yet unknown one */ - if (trdx_hw_tag.prodid > (sizeof(toradex_modules) / sizeof(toradex_modules[0]))) + if (trdx_hw_tag.prodid > (sizeof(toradex_modules) / + sizeof(toradex_modules[0]))) trdx_hw_tag.prodid = 0; out: -- cgit v1.2.3