From 48d1a01b2d67f323dc63fbb726e1fa445172840d Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Tue, 1 Jul 2025 09:34:07 +0200 Subject: [PATCH] net: sockets: Specify alignment for sockaddr* structs To avoid misalignment errors when casting between sockaddr_storage/sockaddr and specialied sockaddr_* variants, specify alignment for the former to match the alignment of the others. The issue was reported by UBSAN: utils.c:802:8: runtime error: member access within misaligned address 0xf4aff186 for type 'struct sockaddr_in6', which requires 4 byte alignment Signed-off-by: Robert Lubos --- include/zephyr/net/net_ip.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/zephyr/net/net_ip.h b/include/zephyr/net/net_ip.h index c2cce74817f..c0ea40745c4 100644 --- a/include/zephyr/net/net_ip.h +++ b/include/zephyr/net/net_ip.h @@ -404,26 +404,28 @@ struct cmsghdr { /** @endcond */ +#define SOCKADDR_ALIGN (4) + /** Generic sockaddr struct. Must be cast to proper type. */ struct sockaddr { sa_family_t sa_family; /**< Address family */ /** @cond INTERNAL_HIDDEN */ char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)]; /** @endcond */ -}; +} __aligned(SOCKADDR_ALIGN); /** @cond INTERNAL_HIDDEN */ struct sockaddr_ptr { sa_family_t family; char data[NET_SOCKADDR_PTR_MAX_SIZE - sizeof(sa_family_t)]; -}; +} __aligned(SOCKADDR_ALIGN); /* Same as sockaddr in our case */ struct sockaddr_storage { sa_family_t ss_family; char data[NET_SOCKADDR_MAX_SIZE - sizeof(sa_family_t)]; -}; +} __aligned(SOCKADDR_ALIGN); /* Socket address struct for UNIX domain sockets */ struct sockaddr_un {