From 4f3c176ad96f67ce58a29636ebb11b95d7675e46 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 4 Jun 2026 13:25:03 -0300 Subject: [PATCH] socket: properly handle cmsg alignment --- kernel-src/include/kernel/abi.h | 1 + kernel-src/include/kernel/sock.h | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/kernel-src/include/kernel/abi.h b/kernel-src/include/kernel/abi.h index 01f073cb..04470c26 100644 --- a/kernel-src/include/kernel/abi.h +++ b/kernel-src/include/kernel/abi.h @@ -90,6 +90,7 @@ typedef struct { #define SOCK_STREAM 1 #define SOCK_DGRAM 2 #define SOCK_RAW 3 +#define SOCK_SEQPACKET 5 #define MSG_CMSG_CLOEXEC 0x40000000 #define MSG_CTRUNC 0x8 diff --git a/kernel-src/include/kernel/sock.h b/kernel-src/include/kernel/sock.h index 19d29e39..c5806348 100644 --- a/kernel-src/include/kernel/sock.h +++ b/kernel-src/include/kernel/sock.h @@ -263,19 +263,24 @@ static inline void sock_freemsghdr(msghdr_t *hdr) { free(hdr->msgctrl); } -#define SOCK_CTRL_NEXT(c) ((sockctrl_t *)((uintptr_t)(c) + (c)->length)) +#define SOCK_CTRL_ALIGN(x) (((x) + sizeof(size_t) - 1) & ~(sizeof(size_t) - 1)) +#define SOCK_CTRL_LEN(x) (SOCK_CTRL_ALIGN(sizeof(sockctrl_t)) + (x)) +#define SOCK_CTRL_SPACE(x) (SOCK_CTRL_ALIGN(sizeof(sockctrl_t)) + SOCK_CTRL_ALIGN(x)) +#define SOCK_CTRL_DATALEN(c) ((c)->length - SOCK_CTRL_ALIGN(sizeof(sockctrl_t))) +#define SOCK_CTRL_NEXT(c) ((sockctrl_t *)((uintptr_t)(c) + SOCK_CTRL_ALIGN((c)->length))) static inline size_t sock_countctrl(sockctrl_t *ctrl, size_t len) { size_t count = 0; - uintmax_t offset = 0; + size_t offset = 0; while (offset < len) { - if (ctrl->length < sizeof(sockctrl_t)) + if (ctrl->length < SOCK_CTRL_LEN(0)) break; - offset += ctrl->length; + size_t alignedlen = SOCK_CTRL_ALIGN(ctrl->length); + offset += alignedlen; - if (offset > len || offset < ctrl->length) + if (offset > len || offset < alignedlen) break; ++count;