In of_parse_phandle_with_args_map() the inner loop that iterates through the map entries calls of_node_put(new) to free the reference acquired by the previous iteration of the inner loop. This assumes that the value of "new" is NULL on the first iteration of the inner loop. Make sure that this is true in all iterations of the outer loop by setting "new" to NULL after its value is assigned to "cur". Extend the unittest to detect the double free and add an additional test case that actually triggers this path. Fixes: bd6f2fd5a1 ("of: Support parsing phandle argument lists through a nexus node") Cc: Stephen Boyd <stephen.boyd@linaro.org> Signed-off-by: "Christian A. Ehrhardt" <lk@c--e.de> Link: https://lore.kernel.org/r/20231229105411.1603434-1-lk@c--e.de Signed-off-by: Rob Herring <robh@kernel.org>
85 lines
1.8 KiB
Plaintext
85 lines
1.8 KiB
Plaintext
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
/ {
|
|
aliases {
|
|
testcase-alias = &testcase;
|
|
};
|
|
|
|
testcase: testcase-data {
|
|
security-password = "password";
|
|
duplicate-name = "duplicate";
|
|
|
|
duplicate-name { };
|
|
|
|
phandle-tests {
|
|
provider0: provider0 {
|
|
#phandle-cells = <0>;
|
|
};
|
|
|
|
provider1: provider1 {
|
|
#phandle-cells = <1>;
|
|
};
|
|
|
|
provider2: provider2 {
|
|
#phandle-cells = <2>;
|
|
};
|
|
|
|
provider3: provider3 {
|
|
#phandle-cells = <3>;
|
|
};
|
|
|
|
provider4: provider4 {
|
|
#phandle-cells = <2>;
|
|
phandle-map = <0 1 &provider1 3>,
|
|
<4 0 &provider0>,
|
|
<16 5 &provider3 3 5 0>,
|
|
<200 8 &provider2 23 6>,
|
|
<19 0 &provider2 15 0>,
|
|
<2 3 &provider3 2 5 3>;
|
|
phandle-map-mask = <0xff 0xf>;
|
|
phandle-map-pass-thru = <0x0 0xf0>;
|
|
};
|
|
|
|
provider5: provider5 {
|
|
#phandle-cells = <2>;
|
|
phandle-map = <2 7 &provider4 2 3>;
|
|
phandle-map-mask = <0xff 0xf>;
|
|
phandle-map-pass-thru = <0x0 0xf0>;
|
|
};
|
|
|
|
consumer-a {
|
|
phandle-list = <&provider1 1>,
|
|
<&provider2 2 0>,
|
|
<0>,
|
|
<&provider3 4 4 3>,
|
|
<&provider2 5 100>,
|
|
<&provider0>,
|
|
<&provider1 7>;
|
|
phandle-list-names = "first", "second", "third";
|
|
|
|
phandle-list-bad-phandle = <12345678 0 0>;
|
|
phandle-list-bad-args = <&provider2 1 0>,
|
|
<&provider3 0>;
|
|
empty-property;
|
|
string-property = "foobar";
|
|
unterminated-string = [40 41 42 43];
|
|
unterminated-string-list = "first", "second", [40 41 42 43];
|
|
};
|
|
|
|
consumer-b {
|
|
phandle-list = <&provider1 1>,
|
|
<&provider4 2 3>,
|
|
<0>,
|
|
<&provider4 4 0x100>,
|
|
<&provider4 0 0x61>,
|
|
<&provider0>,
|
|
<&provider4 19 0x20>,
|
|
<&provider5 2 7>;
|
|
phandle-list-bad-phandle = <12345678 0 0>;
|
|
phandle-list-bad-args = <&provider2 1 0>,
|
|
<&provider4 0>;
|
|
};
|
|
};
|
|
};
|
|
};
|