diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/.gitignore | 1 | ||||
| -rw-r--r-- | tests/Makefile.tests | 3 | ||||
| -rw-r--r-- | tests/meson.build | 1 | ||||
| -rwxr-xr-x | tests/run_tests.sh | 1 | ||||
| -rw-r--r-- | tests/testdata.h | 1 | ||||
| -rw-r--r-- | tests/trees.S | 17 | ||||
| -rw-r--r-- | tests/truncated_memrsv.c | 9 | ||||
| -rw-r--r-- | tests/unterminated_memrsv.c | 67 |
8 files changed, 99 insertions, 1 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 3376ed9..a1f53dd 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -72,6 +72,7 @@ tmp.* /truncated_property /truncated_string /truncated_memrsv +/unterminated_memrsv /utilfdt_test /value-labels /get_next_tag_invalid_prop_len diff --git a/tests/Makefile.tests b/tests/Makefile.tests index 05bb3b2..94b3cf9 100644 --- a/tests/Makefile.tests +++ b/tests/Makefile.tests @@ -32,7 +32,8 @@ LIB_TESTS_L = get_mem_rsv \ fs_tree1 LIB_TESTS = $(LIB_TESTS_L:%=$(TESTS_PREFIX)%) -LIBTREE_TESTS_L = truncated_property truncated_string truncated_memrsv +LIBTREE_TESTS_L = truncated_property truncated_string \ + truncated_memrsv unterminated_memrsv LIBTREE_TESTS = $(LIBTREE_TESTS_L:%=$(TESTS_PREFIX)%) diff --git a/tests/meson.build b/tests/meson.build index 37bfd47..4e669ce 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -96,6 +96,7 @@ tests += [ 'truncated_memrsv', 'truncated_property', 'truncated_string', + 'unterminated_memrsv', ] test_deps = [testutil_dep, util_dep, libfdt_dep] diff --git a/tests/run_tests.sh b/tests/run_tests.sh index f07092b..34110c1 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -495,6 +495,7 @@ libfdt_tests () { run_test truncated_property run_test truncated_string run_test truncated_memrsv + run_test unterminated_memrsv # Check aliases support in fdt_path_offset run_dtc_test -I dts -O dtb -o aliases.dtb "$SRCDIR/aliases.dts" diff --git a/tests/testdata.h b/tests/testdata.h index fcebc2c..b29a759 100644 --- a/tests/testdata.h +++ b/tests/testdata.h @@ -55,6 +55,7 @@ extern struct fdt_header bad_prop_char; extern struct fdt_header ovf_size_strings; extern struct fdt_header truncated_string; extern struct fdt_header truncated_memrsv; +extern struct fdt_header unterminated_memrsv; extern struct fdt_header two_roots; extern struct fdt_header named_root; #endif /* ! __ASSEMBLER__ */ diff --git a/tests/trees.S b/tests/trees.S index d69f7f1..3de95fa 100644 --- a/tests/trees.S +++ b/tests/trees.S @@ -291,6 +291,23 @@ truncated_memrsv_rsvmap_end: truncated_memrsv_end: + /* unterminated_memrsv */ + treehdr unterminated_memrsv + +unterminated_memrsv_rsvmap: + rsvmape TEST_ADDR_1H, TEST_ADDR_1L, TEST_SIZE_1H, TEST_SIZE_1L +unterminated_memrsv_rsvmap_end: + +unterminated_memrsv_struct: + beginn "" + endn + fdtlong FDT_END +unterminated_memrsv_struct_end: + +unterminated_memrsv_strings: +unterminated_memrsv_strings_end: + +unterminated_memrsv_end: /* two root nodes */ treehdr two_roots diff --git a/tests/truncated_memrsv.c b/tests/truncated_memrsv.c index d78036c..b7ab4e7 100644 --- a/tests/truncated_memrsv.c +++ b/tests/truncated_memrsv.c @@ -15,9 +15,12 @@ #include "tests.h" #include "testdata.h" +#define SPACE 65536 + int main(int argc, char *argv[]) { void *fdt = &truncated_memrsv; + void *buf; int err; uint64_t addr, size; @@ -46,5 +49,11 @@ int main(int argc, char *argv[]) FAIL("fdt_get_mem_rsv(1) returned %d instead of -FDT_ERR_BADOFFSET", err); + buf = xmalloc(SPACE); + err = fdt_open_into(fdt, buf, SPACE); + if (err != -FDT_ERR_TRUNCATED) + FAIL("fdt_open_into() returned %d instead of -FDT_ERR_TRUNCATED", + err); + PASS(); } diff --git a/tests/unterminated_memrsv.c b/tests/unterminated_memrsv.c new file mode 100644 index 0000000..441b8d7 --- /dev/null +++ b/tests/unterminated_memrsv.c @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * libfdt - Flat Device Tree manipulation + * Testcase for misbehaviour on an unterminated memrsv map + * Copyright Red Hat + * + * Based on a proof of concept report from: + * Moshe Strauss <moshestrauss10@gmail.com> + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdint.h> + +#include <libfdt.h> + +#include "tests.h" +#include "testdata.h" + +#define SPACE 65536 + +int main(int argc, char *argv[]) +{ + void *fdt = &unterminated_memrsv; + void *buf; + int err; + uint64_t addr, size; + + test_init(argc, argv); + + err = fdt_check_header(fdt); + if (err != 0) + FAIL("Bad header: %s", fdt_strerror(err)); + + err = fdt_num_mem_rsv(fdt); + if (err != -FDT_ERR_TRUNCATED) + FAIL("fdt_num_mem_rsv() returned %d instead of -FDT_ERR_TRUNCATED", + err); + + err = fdt_get_mem_rsv(fdt, 0, &addr, &size); + if (err != 0) + FAIL("fdt_get_mem_rsv() failed on first entry: %s", + fdt_strerror(err)); + if ((addr != TEST_ADDR_1) || (size != TEST_SIZE_1)) + FAIL("Entry doesn't match: (0x%llx, 0x%llx) != (0x%llx, 0x%llx)", + (unsigned long long)addr, (unsigned long long)size, + TEST_ADDR_1, TEST_SIZE_1); + + err = fdt_add_mem_rsv(fdt, TEST_ADDR_2, TEST_SIZE_2); + if (err != -FDT_ERR_TRUNCATED) + FAIL("fdt_add_mem_rsv() returned %d instead of -FDT_ERR_TRUNCATED", + err); + + err = fdt_del_mem_rsv(fdt, 0); + if (err != -FDT_ERR_TRUNCATED) + FAIL("fdt_del_mem_rsv() returned %d instead of -FDT_ERR_TRUNCATED", + err); + + buf = xmalloc(SPACE); + err = fdt_open_into(fdt, buf, SPACE); + if (err != -FDT_ERR_TRUNCATED) + FAIL("fdt_open_into() returned %d instead of -FDT_ERR_TRUNCATED", + err); + + PASS(); +} |
