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 <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2025-07-01 09:34:07 +02:00 committed by Daniel DeGrasse
parent 8124032cbb
commit 48d1a01b2d

View File

@ -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 {