Browse Source

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 10 years ago committed by David Gibson
parent
commit
64c46b098b
  1. 2
      checks.c
  2. 12
      tests/bad-size-cells.dts
  3. 2
      tests/run_tests.sh

2
checks.c

@ -560,7 +560,7 @@ static void check_reg_format(struct check *c, struct node *dt,
size_cells = node_size_cells(node->parent); size_cells = node_size_cells(node->parent);
entrylen = (addr_cells + size_cells) * sizeof(cell_t); 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) " FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
"(#address-cells == %d, #size-cells == %d)", "(#address-cells == %d, #size-cells == %d)",
node->fullpath, prop->val.len, addr_cells, size_cells); node->fullpath, prop->val.len, addr_cells, size_cells);

12
tests/bad-size-cells.dts

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

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

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

2
tests/run_tests.sh

@ -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.test.dtb embedded_nul.dts
run_dtc_test -I dts -O dtb -o embedded_nul_equiv.test.dtb embedded_nul_equiv.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_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 () { dtc_tests () {

Loading…
Cancel
Save