Skip to content

Commit 4076f73

Browse files
maci0jmberg-intel
authored andcommitted
um: fix address-of CMSG_DATA() rvalue in stub
The UML stub takes the address of CMSG_DATA(fd_msg): fd_map = (void *)&CMSG_DATA(fd_msg); CMSG_DATA() is specified by POSIX to return unsigned char *. Taking its address is semantically wrong -- the intent is to get a pointer to the control message data, which is exactly what CMSG_DATA() already returns. This happens to compile with glibc because glibc's primary CMSG_DATA definition accesses a flexible array member: #define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data) An array lvalue can have its address taken, and &array yields the same address as array. However, glibc also has an alternative definition that uses pointer arithmetic (returning an rvalue), and musl's definition always uses pointer arithmetic: /* musl */ #define CMSG_DATA(cmsg) \ ((unsigned char *)(((struct cmsghdr *)(cmsg)) + 1)) Taking the address of an rvalue is a hard error in C, so the current code fails to compile with musl libc. Remove the erroneous & operator. The resulting code is correct regardless of the CMSG_DATA implementation -- it simply assigns the data pointer, which is what the subsequent code (fd_map[--num_fds]) expects. No functional change with glibc; fixes the build with musl. Signed-off-by: Marcel W. Wysocki <maci.stgn@gmail.com> Link: https://patch.msgid.link/20260215142803.1455757-1-maci.stgn@gmail.com Signed-off-by: Johannes Berg <johannes.berg@intel.com>
1 parent f338e77 commit 4076f73

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

arch/um/kernel/skas/stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ stub_signal_interrupt(int sig, siginfo_t *info, void *p)
146146
/* Receive the FDs */
147147
num_fds = 0;
148148
fd_msg = msghdr.msg_control;
149-
fd_map = (void *)&CMSG_DATA(fd_msg);
149+
fd_map = (void *)CMSG_DATA(fd_msg);
150150
if (res == iov.iov_len && msghdr.msg_controllen > sizeof(struct cmsghdr))
151151
num_fds = (fd_msg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
152152

0 commit comments

Comments
 (0)