On 13/12/2022 09:45, Kevin Brodsky wrote:
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.
Right, I will reword to make it clearer :)
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?
Discussed down thread, so will keep it as is.
Kevin
Thanks for the review !
Téo
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