selftests/bpf: Add test validating failure on ambiguous relocation value
authorAndrii Nakryiko <andriin@fb.com>
Tue, 18 Aug 2020 22:39:16 +0000 (15:39 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 19 Aug 2020 01:12:46 +0000 (18:12 -0700)
Add test simulating ambiguous field size relocation, while fields themselves
are at the exact same offset.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200818223921.2911963-5-andriin@fb.com
tools/testing/selftests/bpf/prog_tests/core_reloc.c
tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/core_reloc_types.h

index a54eafc..4d650e9 100644 (file)
@@ -452,6 +452,7 @@ static struct core_reloc_test_case test_cases[] = {
        /* size relocation checks */
        SIZE_CASE(size),
        SIZE_CASE(size___diff_sz),
+       SIZE_ERR_CASE(size___err_ambiguous),
 };
 
 struct data {
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_size___err_ambiguous.c
new file mode 100644 (file)
index 0000000..f3e9904
--- /dev/null
@@ -0,0 +1,4 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_size___err_ambiguous1 x,
+       struct core_reloc_size___err_ambiguous2 y) {}
index 69139ed..3b1126c 100644 (file)
@@ -809,3 +809,28 @@ struct core_reloc_size___diff_sz {
        void *ptr_field;
        enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field;
 };
+
+/* Error case of two candidates with the fields (int_field) at the same
+ * offset, but with differing final relocation values: size 4 vs size 1
+ */
+struct core_reloc_size___err_ambiguous1 {
+       /* int at offset 0 */
+       int int_field;
+
+       struct { int x; } struct_field;
+       union { int x; } union_field;
+       int arr_field[4];
+       void *ptr_field;
+       enum { VALUE___1 = 123 } enum_field;
+};
+
+struct core_reloc_size___err_ambiguous2 {
+       /* char at offset 0 */
+       char int_field;
+
+       struct { int x; } struct_field;
+       union { int x; } union_field;
+       int arr_field[4];
+       void *ptr_field;
+       enum { VALUE___2 = 123 } enum_field;
+};