aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Boyd <stephen.boyd@linaro.org>2017-01-30 14:06:17 -0800
committerDavid Gibson <david@gibson.dropbear.id.au>2017-01-31 09:50:22 +1100
commit3b9c97093d6e1067f4d24d2bff32f3dd24e0751e (patch)
tree33661acd3aae1a35391cbbef4efdf1a19b19c497
parent43eb551426ea05186ea07140ad4e277eb253c32c (diff)
downloaddtc-3b9c97093d6e1067f4d24d2bff32f3dd24e0751e.zip
dtc-3b9c97093d6e1067f4d24d2bff32f3dd24e0751e.tar.gz
dtc-3b9c97093d6e1067f4d24d2bff32f3dd24e0751e.tar.bz2
dtc: Fix NULL pointer use in dtlabel + dtref case
If we have a construct like this: label: &handle { ... }; Running dtc on it will cause a segfault, because we use 'target' when it could be NULL. Move the add_label() call into the if statement to fix this potentially bad use of a NULL pointer. Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r--dtc-parser.y6
-rwxr-xr-xtests/run_tests.sh1
-rw-r--r--tests/test_label_ref.dts9
3 files changed, 13 insertions, 3 deletions
diff --git a/dtc-parser.y b/dtc-parser.y
index b2fd4d1..ca3f500 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -171,10 +171,10 @@ devicetree:
{
struct node *target = get_node_by_ref($1, $3);
- add_label(&target->labels, $2);
- if (target)
+ if (target) {
+ add_label(&target->labels, $2);
merge_nodes(target, $4);
- else
+ } else
ERROR(&@3, "Label or path %s not found", $3);
$$ = $1;
}
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 157dbae..ed489db 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -511,6 +511,7 @@ dtc_tests () {
run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb
run_dtc_test -I dts -O dtb -o dtc_tree1_merge_path.test.dtb test_tree1_merge_path.dts
tree1_tests dtc_tree1_merge_path.test.dtb test_tree1.dtb
+ run_wrap_error_test $DTC -I dts -O dtb -o /dev/null test_label_ref.dts
# Check prop/node delete functionality
run_dtc_test -I dts -O dtb -o dtc_tree1_delete.test.dtb test_tree1_delete.dts
diff --git a/tests/test_label_ref.dts b/tests/test_label_ref.dts
new file mode 100644
index 0000000..7009c79
--- /dev/null
+++ b/tests/test_label_ref.dts
@@ -0,0 +1,9 @@
+/dts-v1/;
+
+/ {
+
+};
+
+label: &handle {
+
+};