Browse Source

Avoid assertion in check_interrupts_property()

If running on a tree with an 'interrupt-parent' property which contains
an invalid phandle (0 or -1, not merely for a node which doesn't exist),
then check_interrupts_property() will trip the assertion in
get_node_by_phandle().

There's logic that almost detects this, but it only handles the overlay
case, where we can't fully check because the links will be fixed up later.

For the non-overlay case, this is definitely a bad property, but we
shouldn't crash.  Fix it by failing the check early.

Fixes: c1e55a5513 ("checks: fix handling of unresolved phandles for dts plugins")
Fixes: ee3d26f696 ("checks: add interrupts property check")
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
David Gibson 6 years ago
parent
commit
8f69567622
  1. 10
      checks.c

10
checks.c

@ -1580,10 +1580,14 @@ static void check_interrupts_property(struct check *c,
prop = get_property(parent, "interrupt-parent"); prop = get_property(parent, "interrupt-parent");
if (prop) { if (prop) {
phandle = propval_cell(prop); phandle = propval_cell(prop);
/* Give up if this is an overlay with external references */ if ((phandle == 0) || (phandle == -1)) {
if ((phandle == 0 || phandle == -1) && /* Give up if this is an overlay with
(dti->dtsflags & DTSF_PLUGIN)) * external references */
if (dti->dtsflags & DTSF_PLUGIN)
return; return;
FAIL_PROP(c, dti, parent, prop, "Invalid phandle");
continue;
}


irq_node = get_node_by_phandle(root, phandle); irq_node = get_node_by_phandle(root, phandle);
if (!irq_node) { if (!irq_node) {

Loading…
Cancel
Save