Patch "libbpf: Fix btf__align_of() by taking into account field offsets" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    libbpf: Fix btf__align_of() by taking into account field offsets

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     libbpf-fix-btf__align_of-by-taking-into-account-fiel.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 42b245a6404acfe4b4e32a67fffcb1e93af88305
Author: Andrii Nakryiko <andrii@xxxxxxxxxx>
Date:   Mon Dec 12 13:15:03 2022 -0800

    libbpf: Fix btf__align_of() by taking into account field offsets
    
    [ Upstream commit 25a4481b4136af7794e1df2d6c90ed2f354d60ce ]
    
    btf__align_of() is supposed to be return alignment requirement of
    a requested BTF type. For STRUCT/UNION it doesn't always return correct
    value, because it calculates alignment only based on field types. But
    for packed structs this is not enough, we need to also check field
    offsets and struct size. If field offset isn't aligned according to
    field type's natural alignment, then struct must be packed. Similarly,
    if struct size is not a multiple of struct's natural alignment, then
    struct must be packed as well.
    
    This patch fixes this issue precisely by additionally checking these
    conditions.
    
    Fixes: 3d208f4ca111 ("libbpf: Expose btf__align_of() API")
    Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx>
    Signed-off-by: Daniel Borkmann <daniel@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/bpf/20221212211505.558851-5-andrii@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
index e6f644cdc9f15..f7c48b1fb3a05 100644
--- a/tools/lib/bpf/btf.c
+++ b/tools/lib/bpf/btf.c
@@ -614,8 +614,21 @@ int btf__align_of(const struct btf *btf, __u32 id)
 			if (align <= 0)
 				return align;
 			max_align = max(max_align, align);
+
+			/* if field offset isn't aligned according to field
+			 * type's alignment, then struct must be packed
+			 */
+			if (btf_member_bitfield_size(t, i) == 0 &&
+			    (m->offset % (8 * align)) != 0)
+				return 1;
 		}
 
+		/* if struct/union size isn't a multiple of its alignment,
+		 * then struct must be packed
+		 */
+		if ((t->size % max_align) != 0)
+			return 1;
+
 		return max_align;
 	}
 	default:



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux