summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/run_tests.sh4
-rw-r--r--tests/sourceoutput.dts14
-rw-r--r--treesource.c2
3 files changed, 19 insertions, 1 deletions
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index c6adf21..f94d361 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -271,6 +271,10 @@ libfdt_tests () {
# Specific bug tests
run_test add_subnode_with_nops
+ run_dtc_test -I dts -O dts -o sourceoutput.test.dts sourceoutput.dts
+ run_dtc_test -I dts -O dtb -o sourceoutput.test.dtb sourceoutput.dts
+ run_dtc_test -I dts -O dtb -o sourceoutput.test.dts.test.dtb sourceoutput.test.dts
+ run_test dtbs_equal_ordered sourceoutput.test.dtb sourceoutput.test.dts.test.dtb
}
dtc_tests () {
diff --git a/tests/sourceoutput.dts b/tests/sourceoutput.dts
new file mode 100644
index 0000000..477762f
--- /dev/null
+++ b/tests/sourceoutput.dts
@@ -0,0 +1,14 @@
+/dts-v1/;
+
+/ {
+ /* Some versions had an off-by-2 bug which caused an abort
+ * when outputing labels within strings like this in source
+ * format */
+ prop1: prop1 = start1: "foo", mid1: "bar" end1: ;
+
+ /* Make sure that we correctly handle source output of things
+ * which could almost be expressed as strings, except for the
+ * embedded labels */
+ prop2 = start2: [66 6f 6f], mid2: "bar" end2: ;
+};
+
diff --git a/treesource.c b/treesource.c
index bf7a626..3a87b9f 100644
--- a/treesource.c
+++ b/treesource.c
@@ -109,7 +109,7 @@ static void write_propval_string(FILE *f, struct data val)
break;
case '\0':
fprintf(f, "\", ");
- while (m && (m->offset < i)) {
+ while (m && (m->offset <= (i + 1))) {
if (m->type == LABEL) {
assert(m->offset == (i+1));
fprintf(f, "%s: ", m->ref);