summaryrefslogtreecommitdiff
path: root/board/siemens/common
diff options
context:
space:
mode:
authorHeiko Schocher <hs@denx.de>2014-11-18 11:51:04 +0100
committerTom Rini <trini@ti.com>2014-12-04 21:28:32 -0500
commit7dc60d81a1876cdc5946da2011d5a34339be8e37 (patch)
treee20ad1ba15a94672520dadd0b2453b8001b77bf3 /board/siemens/common
parentfb384c4720ca7496775d6578f184bf628db73456 (diff)
downloadu-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.c26
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;