mirror of https://gitlab.com/qemu-project/dtc.git
libfdt: Fix fdt_strerror() bugs
This fixes several small bugs related to fdt_strerror(). - an entry is added to the error table for FDT_ERR_BADLAYOUT. - Incorrect usage of fdt_strerror() in check_property() and check_getprop() is corrected (they were passing a positive error code, when fdt_strerror() expects a negative code). - Add code to properly retreive an error code from fdt_get_property() in check_property(). With that a check that the length returned by fdt_get_property() matches that stored in the retreived property. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
5b344f9c5a
commit
5434fcc7e0
|
@ -43,13 +43,14 @@ static struct errtabent errtable[] = {
|
|||
ERRTABENT(FDT_ERR_BADMAGIC),
|
||||
ERRTABENT(FDT_ERR_BADVERSION),
|
||||
ERRTABENT(FDT_ERR_BADSTRUCTURE),
|
||||
ERRTABENT(FDT_ERR_BADLAYOUT),
|
||||
};
|
||||
#define ERRTABSIZE (sizeof(errtable) / sizeof(errtable[0]))
|
||||
|
||||
const char *fdt_strerror(int errval)
|
||||
{
|
||||
if (errval > 0)
|
||||
return "<valid offset>";
|
||||
return "<valid offset/length>";
|
||||
else if (errval == 0)
|
||||
return "<no error>";
|
||||
else if (errval > -ERRTABSIZE) {
|
||||
|
|
|
@ -72,14 +72,16 @@ void check_property(void *fdt, int nodeoffset, const char *name,
|
|||
int len, const void *val)
|
||||
{
|
||||
const struct fdt_property *prop;
|
||||
int retlen;
|
||||
uint32_t tag, nameoff, proplen;
|
||||
const char *propname;
|
||||
|
||||
verbose_printf("Checking property \"%s\"...", name);
|
||||
prop = fdt_get_property(fdt, nodeoffset, name, NULL);
|
||||
prop = fdt_get_property(fdt, nodeoffset, name, &retlen);
|
||||
verbose_printf("pointer %p\n", prop);
|
||||
if (! prop)
|
||||
FAIL("NULL retreiving \"%s\" pointer", name);
|
||||
FAIL("Error retreiving \"%s\" pointer: %s", name,
|
||||
fdt_strerror(retlen));
|
||||
|
||||
tag = fdt32_to_cpu(prop->tag);
|
||||
nameoff = fdt32_to_cpu(prop->nameoff);
|
||||
|
@ -92,6 +94,10 @@ void check_property(void *fdt, int nodeoffset, const char *name,
|
|||
if (!propname || !streq(propname, name))
|
||||
FAIL("Property name mismatch \"%s\" instead of \"%s\"",
|
||||
propname, name);
|
||||
if (proplen != retlen)
|
||||
FAIL("Length retrieved for \"%s\" by fdt_get_property()"
|
||||
" differs from stored length (%d != %d)",
|
||||
name, retlen, proplen);
|
||||
if (proplen != len)
|
||||
FAIL("Size mismatch on property \"%s\": %d insead of %d",
|
||||
name, proplen, len);
|
||||
|
@ -108,7 +114,7 @@ void *check_getprop(void *fdt, int nodeoffset, const char *name,
|
|||
|
||||
propval = fdt_getprop(fdt, nodeoffset, name, &proplen);
|
||||
if (! propval)
|
||||
FAIL("fdt_getprop(\"%s\"): %s", name, fdt_strerror(-proplen));
|
||||
FAIL("fdt_getprop(\"%s\"): %s", name, fdt_strerror(proplen));
|
||||
|
||||
if (proplen != len)
|
||||
FAIL("Size mismatch on property \"%s\": %d insead of %d",
|
||||
|
|
Loading…
Reference in New Issue