On 12/12/2022 18:07, Teo Couprie Diaz wrote:
void* can cause issues for alignment now that its size depends on whether it is compat or purecap. In struct __kernel_sockaddr_storage, it is not annotated with __user, so it is affected.
To be more specific, the issue is not that its size depends on the ABI (that's the intention in fact), but rather that it is a trick to get 32-bit alignment on a 32-bit arch and 64-bit on a 64-bit arch. So far void * fitted the bill, but purecap broke that.
Change it to an unsigned long. Musl uses the same type for its struct definitions.
I've just looked at the definition of struct sockaddr_storage in Musl and it is not in fact using this trick (probably because compat is not a concern there), the __align unsigned long at the end is not actually aligning anything (it's a struct, not a union). Or am I missing something?
Kevin
Signed-off-by: Teo Couprie Diaz teo.coupriediaz@arm.com
include/uapi/linux/socket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h index 51d6bb2f6765..28ff6a4aebca 100644 --- a/include/uapi/linux/socket.h +++ b/include/uapi/linux/socket.h @@ -22,7 +22,7 @@ struct __kernel_sockaddr_storage { /* space to achieve desired size, */ /* _SS_MAXSIZE value minus size of ss_family */ };
void *__align; /* implementation specific desired alignment */
};unsigned long __align; /* implementation specific desired alignment */
};
base-commit: bbd29c87073f43eb8c09e8a2c2f4508b46a831a0