diff options
author | Heiko Schocher <hs@denx.de> | 2014-11-18 11:51:04 +0100 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2014-12-04 21:28:32 -0500 |
commit | 7dc60d81a1876cdc5946da2011d5a34339be8e37 (patch) | |
tree | e20ad1ba15a94672520dadd0b2453b8001b77bf3 /board/siemens/common | |
parent | fb384c4720ca7496775d6578f184bf628db73456 (diff) | |
download | u-boot-imx-7dc60d81a1876cdc5946da2011d5a34339be8e37.zip u-boot-imx-7dc60d81a1876cdc5946da2011d5a34339be8e37.tar.gz u-boot-imx-7dc60d81a1876cdc5946da2011d5a34339be8e37.tar.bz2 |
arm, am335x, siemens: fix factoryset interpretation
a record could contain other records, so after an ">" (begin mark)
there not always come an end mark "<", instead a ">" is possible.
Take care of this.
Signed-off-by: Heiko Schocher <hs@denx.de>
Diffstat (limited to 'board/siemens/common')
-rw-r--r-- | board/siemens/common/factoryset.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/board/siemens/common/factoryset.c b/board/siemens/common/factoryset.c index 266dbbb..d98e59d 100644 --- a/board/siemens/common/factoryset.c +++ b/board/siemens/common/factoryset.c @@ -86,6 +86,7 @@ int get_factory_record_val(unsigned char *eeprom_buf, int size, uchar *record, int i, nxt = 0; int c; unsigned char end = 0xff; + unsigned char tmp; for (i = 0; fact_get_char(i) != end; i = nxt) { nxt = i + 1; @@ -93,6 +94,7 @@ int get_factory_record_val(unsigned char *eeprom_buf, int size, uchar *record, int pos; int endpos; int z; + int level = 0; c = strncmp((char *)&eeprom_buf[i + 1], (char *)record, strlen((char *)record)); @@ -103,22 +105,30 @@ int get_factory_record_val(unsigned char *eeprom_buf, int size, uchar *record, /* search for "<" */ c = -1; for (z = pos; fact_get_char(z) != end; z++) { - if ((fact_get_char(z) == '<') || - (fact_get_char(z) == '>')) { - endpos = z; - nxt = endpos; - c = 0; - break; + if (fact_get_char(z) == '<') { + if (level == 0) { + endpos = z; + nxt = endpos; + c = 0; + break; + } else { + level--; + } } + if (fact_get_char(z) == '>') + level++; } + } else { + continue; } if (c == 0) { /* end found -> call get_factory_val */ + tmp = eeprom_buf[endpos]; eeprom_buf[endpos] = end; ret = get_factory_val(&eeprom_buf[pos], - size - pos, name, buf, len); + endpos - pos, name, buf, len); /* fix buffer */ - eeprom_buf[endpos] = '<'; + eeprom_buf[endpos] = tmp; debug("%s: %s.%s = %s\n", __func__, record, name, buf); return ret; |