summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen MacLeod <ken@bitsko.slc.ut.us>2009-09-11 15:16:18 -0500
committerGerald Van Baren <vanbaren@cideas.com>2009-09-24 21:57:30 -0400
commit6e748ea004473cce99fbde6382dd580c10ffdb60 (patch)
tree6ada8413fb9877d9b219a5e1d8a1cdc80092cd91
parent3887c3fbdbbe6bbb4df60ed415c8e1ab9fe56b5e (diff)
downloadu-boot-imx-6e748ea004473cce99fbde6382dd580c10ffdb60.zip
u-boot-imx-6e748ea004473cce99fbde6382dd580c10ffdb60.tar.gz
u-boot-imx-6e748ea004473cce99fbde6382dd580c10ffdb60.tar.bz2
cmd_fdt.c: fix parse of byte streams and strings
Commit 4abd844d8e extended the fdt command parser to handle property strings which are split across multiple arguments but it was broken for byte streams and strings. Byte stream parsing: * Fixes where it would terminate early or go into an endless loop. * Fixes a 0x00 being inserted into the data if there is a space after '[' or a separate argument. * Fixes dereferencing the argument pointer after the last argument. * Checks for bad characters. String parsing: * Treat multiple arguments as a string list. This fixes an issue where only the last argument was stored. Signed-off-by: Ken MacLeod <ken@bitsko.slc.ut.us>
-rw-r--r--common/cmd_fdt.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
index 8683772..919a0bf 100644
--- a/common/cmd_fdt.c
+++ b/common/cmd_fdt.c
@@ -574,14 +574,18 @@ static int fdt_parse_prop(char **newval, int count, char *data, int *len)
* Byte stream. Convert the values.
*/
newp++;
- while ((*newp != ']') && (stridx < count)) {
- tmp = simple_strtoul(newp, &newp, 16);
- *data++ = tmp & 0xFF;
- *len = *len + 1;
+ while ((stridx < count) && (*newp != ']')) {
while (*newp == ' ')
newp++;
- if (*newp != '\0')
+ if (*newp == '\0') {
newp = newval[++stridx];
+ continue;
+ }
+ if (!isxdigit(*newp))
+ break;
+ tmp = simple_strtoul(newp, &newp, 16);
+ *data++ = tmp & 0xFF;
+ *len = *len + 1;
}
if (*newp != ']') {
printf("Unexpected character '%c'\n", *newp);
@@ -589,12 +593,15 @@ static int fdt_parse_prop(char **newval, int count, char *data, int *len)
}
} else {
/*
- * Assume it is a string. Copy it into our data area for
- * convenience (including the terminating '\0').
+ * Assume it is one or more strings. Copy it into our
+ * data area for convenience (including the
+ * terminating '\0's).
*/
while (stridx < count) {
- *len = strlen(newp) + 1;
+ size_t length = strlen(newp) + 1;
strcpy(data, newp);
+ data += length;
+ *len += length;
newp = newval[++stridx];
}
}