cmd_fdt.c: fix parse of byte streams and strings
authorKen MacLeod <ken@bitsko.slc.ut.us>
Fri, 11 Sep 2009 20:16:18 +0000 (15:16 -0500)
committerGerald Van Baren <vanbaren@cideas.com>
Fri, 25 Sep 2009 01:57:30 +0000 (21:57 -0400)
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>
common/cmd_fdt.c

index 8683772..919a0bf 100644 (file)
@@ -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];
                }
        }