From 5277449e5fd13a2f3778ed3380ba157cb9d4ea55 Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Thu, 20 Sep 2018 14:30:03 -0700 Subject: [PATCH] checks: fix simple-bus compatible matching Since commit 7975f6422260 ("Fix widespread incorrect use of strneq(), replace with new strprefixeq()") simple-bus checks have been silently skipped. The problem was 'end - str' is one more than the string length and the strnlen in strprefixeq fails. This can't be fixed simply by subtracting one as it is possible to have multiple '\0' at the end of the property. Fix this by making the 'compatible' property string list check a dependency, and then we can assume the property is null terminated and we can just use streq() for comparisons. Add some tests so the problem doesn't happen again. Fixes: 7975f6422260 ("Fix widespread incorrect use of strneq(), replace with new strprefixeq()") Reported-by: Kumar Gala Signed-off-by: Rob Herring Signed-off-by: David Gibson [Backport from upstream commit e84742aa7b934cd6603e3a64f8c0966f683c5711] Signed-off-by: Thomas Petazzoni --- checks.c | 5 +++-- tests/run_tests.sh | 4 ++++ tests/unit-addr-simple-bus-compatible.dts | 18 ++++++++++++++++++ tests/unit-addr-simple-bus-reg-mismatch.dts | 18 ++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/unit-addr-simple-bus-compatible.dts create mode 100644 tests/unit-addr-simple-bus-reg-mismatch.dts diff --git a/checks.c b/checks.c index a2cc103..acf91c3 100644 --- a/checks.c +++ b/checks.c @@ -910,7 +910,7 @@ static bool node_is_compatible(struct node *node, const char *compat) for (str = prop->val.val, end = str + prop->val.len; str < end; str += strnlen(str, end - str) + 1) { - if (strprefixeq(str, end - str, compat)) + if (streq(str, compat)) return true; } return false; @@ -921,7 +921,8 @@ static void check_simple_bus_bridge(struct check *c, struct dt_info *dti, struct if (node_is_compatible(node, "simple-bus")) node->bus = &simple_bus; } -WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, &addr_size_cells); +WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, + &addr_size_cells, &compatible_is_string_list); static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct node *node) { diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 7348c9c..c4354d2 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -652,6 +652,10 @@ dtc_tests () { check_tests pci-bridge-bad1.dts pci_bridge check_tests pci-bridge-bad2.dts pci_bridge + check_tests unit-addr-simple-bus-reg-mismatch.dts simple_bus_reg + check_tests unit-addr-simple-bus-compatible.dts simple_bus_reg + + # Check warning options run_sh_test dtc-checkfails.sh address_cells_is_cell interrupt_cells_is_cell -n size_cells_is_cell -- -Wno_size_cells_is_cell -I dts -O dtb bad-ncells.dts run_sh_test dtc-fails.sh -n test-warn-output.test.dtb -I dts -O dtb bad-ncells.dts diff --git a/tests/unit-addr-simple-bus-compatible.dts b/tests/unit-addr-simple-bus-compatible.dts new file mode 100644 index 0000000..c8f9341 --- /dev/null +++ b/tests/unit-addr-simple-bus-compatible.dts @@ -0,0 +1,18 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + bus@10000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "foo-bus", "simple-bus"; + ranges = <0x0 0x10000000 0x10000>; + + node@100 { + reg = <0x1000 1>; + }; + }; + +}; diff --git a/tests/unit-addr-simple-bus-reg-mismatch.dts b/tests/unit-addr-simple-bus-reg-mismatch.dts new file mode 100644 index 0000000..2823377 --- /dev/null +++ b/tests/unit-addr-simple-bus-reg-mismatch.dts @@ -0,0 +1,18 @@ +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + bus@10000000 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "simple-bus"; + ranges = <0x0 0x10000000 0x10000>; + + node@100 { + reg = <0x1000 1>; + }; + }; + +}; -- 2.19.1