Fix crash with poorly defined #size-cells

If you have a parent block with #size-cells improperly set to 0, and
then subsequently try to include a regs property in the child, dtc will
crash with SIGFPE while validating it. This patch fixes that crash,
instead printing the same invalid length warning that was causing it.

Test included.

Signed-off-by: Jack Miller <jack@codezen.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Jack Miller 2015-04-29 14:02:24 -05:00 committed by David Gibson
parent 9d3649bd3b
commit 64c46b098b
3 changed files with 15 additions and 1 deletions

View File

@ -560,7 +560,7 @@ static void check_reg_format(struct check *c, struct node *dt,
size_cells = node_size_cells(node->parent);
entrylen = (addr_cells + size_cells) * sizeof(cell_t);

if ((prop->val.len % entrylen) != 0)
if (!entrylen || (prop->val.len % entrylen) != 0)
FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
"(#address-cells == %d, #size-cells == %d)",
node->fullpath, prop->val.len, addr_cells, size_cells);

12
tests/bad-size-cells.dts Normal file
View File

@ -0,0 +1,12 @@
/dts-v1/;

/ {
mangled {
#address-cells = <0x0>;
#size-cells = <0x0>;

valid {
reg = <0x0 0x4000000>;
};
};
};

View File

@ -279,6 +279,8 @@ libfdt_tests () {
run_dtc_test -I dts -O dtb -o embedded_nul.test.dtb embedded_nul.dts
run_dtc_test -I dts -O dtb -o embedded_nul_equiv.test.dtb embedded_nul_equiv.dts
run_test dtbs_equal_ordered embedded_nul.test.dtb embedded_nul_equiv.test.dtb

run_dtc_test -I dts -O dtb bad-size-cells.dts
}

dtc_tests () {