libbpf: Fix dumping non-aligned __int128
authorIlya Leoshkevich <iii@linux.ibm.com>
Wed, 13 Oct 2021 16:09:01 +0000 (18:09 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 20 Oct 2021 18:40:45 +0000 (11:40 -0700)
Non-aligned integers are dumped as bitfields, which is supported for at
most 64-bit integers. Fix by using the same trick as
btf_dump_float_data(): copy non-aligned values to the local buffer.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20211013160902.428340-4-iii@linux.ibm.com
tools/lib/bpf/btf_dump.c

index 679bf34..e98c201 100644 (file)
@@ -1670,9 +1670,10 @@ static int btf_dump_int_data(struct btf_dump *d,
 {
        __u8 encoding = btf_int_encoding(t);
        bool sign = encoding & BTF_INT_SIGNED;
+       char buf[16] __aligned(16);
        int sz = t->size;
 
-       if (sz == 0) {
+       if (sz == 0 || sz > sizeof(buf)) {
                pr_warn("unexpected size %d for id [%u]\n", sz, type_id);
                return -EINVAL;
        }
@@ -1680,8 +1681,10 @@ static int btf_dump_int_data(struct btf_dump *d,
        /* handle packed int data - accesses of integers not aligned on
         * int boundaries can cause problems on some platforms.
         */
-       if (!ptr_is_aligned(data, sz))
-               return btf_dump_bitfield_data(d, t, data, 0, 0);
+       if (!ptr_is_aligned(data, sz)) {
+               memcpy(buf, data, sz);
+               data = buf;
+       }
 
        switch (sz) {
        case 16: {