diff --git a/libfdt/fdt_addresses.c b/libfdt/fdt_addresses.c index d8ba8ec..9a82cd0 100644 --- a/libfdt/fdt_addresses.c +++ b/libfdt/fdt_addresses.c @@ -14,7 +14,7 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name) { const fdt32_t *c; - int val; + uint32_t val; int len; c = fdt_getprop(fdt, nodeoffset, name, &len); @@ -25,10 +25,10 @@ static int fdt_cells(const void *fdt, int nodeoffset, const char *name) return -FDT_ERR_BADNCELLS; val = fdt32_to_cpu(*c); - if ((val <= 0) || (val > FDT_MAX_NCELLS)) + if (val > FDT_MAX_NCELLS) return -FDT_ERR_BADNCELLS; - return val; + return (int)val; } int fdt_address_cells(const void *fdt, int nodeoffset) @@ -36,6 +36,8 @@ int fdt_address_cells(const void *fdt, int nodeoffset) int val; val = fdt_cells(fdt, nodeoffset, "#address-cells"); + if (val == 0) + return -FDT_ERR_BADNCELLS; if (val == -FDT_ERR_NOTFOUND) return 2; return val; diff --git a/tests/addr_size_cells.c b/tests/addr_size_cells.c index 0d90d53..783574d 100644 --- a/tests/addr_size_cells.c +++ b/tests/addr_size_cells.c @@ -47,8 +47,10 @@ int main(int argc, char *argv[]) check_node(fdt, "/", 2, 2); check_node(fdt, "/identity-bus@0", 2, 1); check_node(fdt, "/simple-bus@1000000", 2, 1); + check_node(fdt, "/discrete-bus@2000000", 1, 0); check_node(fdt, "/c0", -FDT_ERR_BADNCELLS, -FDT_ERR_BADNCELLS); check_node(fdt, "/c1", -FDT_ERR_BADNCELLS, -FDT_ERR_BADNCELLS); check_node(fdt, "/c2", -FDT_ERR_BADNCELLS, -FDT_ERR_BADNCELLS); + check_node(fdt, "/c3", -FDT_ERR_BADNCELLS, 0); PASS(); } diff --git a/tests/addresses.dts b/tests/addresses.dts index fab6b19..1b307ab 100644 --- a/tests/addresses.dts +++ b/tests/addresses.dts @@ -13,6 +13,11 @@ #size-cells = <1>; }; + discrete-bus@2000000 { + #address-cells = <1>; + #size-cells = <0>; + }; + c0@0 { #address-cells = <1 1>; #size-cells = <1 1>; @@ -27,4 +32,9 @@ #address-cells = <5>; #size-cells = <5>; }; + + c3@0 { + #address-cells = <0>; + #size-cells = <0>; + }; };