fdt: fix 'prop (...) not found!' error in 'fdt set' command
authorHannes Schmelzer <oe5hpm@oevsv.at>
Fri, 18 Aug 2017 12:41:14 +0000 (14:41 +0200)
committerSimon Glass <sjg@chromium.org>
Mon, 4 Sep 2017 08:10:06 +0000 (02:10 -0600)
This commit brings things back to the well known working state of the
command.
-
With commit 9620d87259572ef21f0df60988d9a932ca673779
(cmd/fdt: support single value replacement within an array)

there was an error introduced modifying (inserting) a property to a
device-tree node.
fdt_getprop(...) returnes a len with -1 for a non-existing property, but
a memcpy with len -1 isn't a good idea and things went wrong (crash).
-
Some times later Tom did repair this
with commit 99bb38e2cce9d99238458e0f6d1880c6d2e80a4d
(fdt: Check for NULL return from fdt_getprop in 'fdt set')

This repairs the crash but the behaviour of the command isn't like
before, it makes it impossible to insert a property.
-

Signed-off-by: Hannes Schmelzer <oe5hpm@oevsv.at>
Acked-by: Simon Glass <sjg@chromium.org>
cmd/fdt.c

index 118613f405169c82d70f5d50c76dec1341761200..d7654b2c4fd5de88c935a8cbc4e2e52be8450eb4 100644 (file)
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -284,16 +284,14 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        len = 0;
                } else {
                        ptmp = fdt_getprop(working_fdt, nodeoffset, prop, &len);
-                       if (!ptmp) {
-                               printf("prop (%s) not found!\n", prop);
-                               return 1;
-                       }
                        if (len > SCRATCHPAD) {
                                printf("prop (%d) doesn't fit in scratchpad!\n",
                                       len);
                                return 1;
                        }
-                       memcpy(data, ptmp, len);
+                       if (ptmp != NULL)
+                               memcpy(data, ptmp, len);
+
                        ret = fdt_parse_prop(&argv[4], argc - 4, data, &len);
                        if (ret != 0)
                                return ret;