Browse Source

Fix dts output with a REF_PATH marker

Commit 8c59a97ce0 ("Fix missing labels when emitting dts format")
fixed label output, but broke output when there is a REF_PATH marker.

The problem is a REF_PATH marker causes a zero length string to be
emitted. The write_propval_string() function requires a length of at
least 1 (including the terminating '\0'), but that was not being
checked.

For the integer output, a length of 0 is valid as it is possible to have
labels inside the starting '<':

int-prop = < start: 0x1234>;

REF_PHANDLE is another marker that we don't explicitly handle, but it
doesn't cause a problem as it is fundamentally just an int.

Fixes: 8c59a97ce0 ("Fix missing labels when emitting dts format")
Reported-by: Kumar Gala <kumar.gala@linaro.org>
Cc: Grant Likely <grant.likely@arm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Rob Herring 6 years ago committed by David Gibson
parent
commit
522d81d572
  1. 2
      tests/path-references.dts
  2. 6
      tests/run_tests.sh
  3. 4
      treesource.c

2
tests/path-references.dts

@ -16,7 +16,7 @@
foobar { foobar {
n3: baz { n3: baz {
ref = &{/foo/baz}; ref = &{/foo/baz};
lref = &n4; lref = start: &n4 end:;
}; };
}; };
foo { foo {

6
tests/run_tests.sh

@ -572,6 +572,12 @@ dtc_tests () {
run_dtc_test -I dts -O dts $tree.test.dts run_dtc_test -I dts -O dts $tree.test.dts
run_wrap_test cmp $tree $tree.test.dts run_wrap_test cmp $tree $tree.test.dts
done done
for tree in path-references; do
run_dtc_test -I dts -O dtb -o $tree.test.dtb $tree.dts
run_dtc_test -I dts -O dts -o $tree.test.dts $tree.dts
run_dtc_test -I dts -O dtb -o $tree.test.dts.test.dtb $tree.test.dts
run_test dtbs_equal_ordered $tree.test.dtb $tree.test.dts.test.dtb
done


# Check -Oyaml output # Check -Oyaml output
if pkg-config --exists yaml-0.1; then if pkg-config --exists yaml-0.1; then

4
treesource.c

@ -64,6 +64,10 @@ static bool isstring(char c)
static void write_propval_string(FILE *f, const char *s, size_t len) static void write_propval_string(FILE *f, const char *s, size_t len)
{ {
const char *end = s + len - 1; const char *end = s + len - 1;

if (!len)
return;

assert(*end == '\0'); assert(*end == '\0');


fprintf(f, "\""); fprintf(f, "\"");

Loading…
Cancel
Save