summaryrefslogtreecommitdiff
path: root/include/sys/socket.h
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2016-06-09 13:42:06 -0400
committerRich Felker <dalias@aerifal.cx>2016-06-09 13:42:06 -0400
commit1e6fc0b690191005a49468c296ad49d0caacacf1 (patch)
tree58025919ba7a72f208e7e5c244a698caebddf9ab /include/sys/socket.h
parenta0bb50a14216e7be7453abee2e7b5830e2a7c4c1 (diff)
downloadmusl-1e6fc0b690191005a49468c296ad49d0caacacf1.tar.gz
avoid padding gaps in struct sockaddr_storage
compilers are free not to copy, or in some cases to clobber, padding bytes in a structure. while it's an aliasing violation, and thus undefined behavior, to copy or manipulate other sockaddr types using sockaddr_storage, it seems likely that traditional code attempts to do so, and the original intent of the sockaddr_storage structure was probably to allow such usage. in the interest of avoiding silent and potentially dangerous breakage, ensure that there are no actual padding bytes in sockaddr_storage by moving and adjusting the size of the __ss_padding member so that it fits exactly. this change also removes a silent assumption that the alignment of long is equal to its size.
Diffstat (limited to 'include/sys/socket.h')
-rw-r--r--include/sys/socket.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/include/sys/socket.h b/include/sys/socket.h
index 76fbde04..55e53d2a 100644
--- a/include/sys/socket.h
+++ b/include/sys/socket.h
@@ -306,8 +306,8 @@ struct sockaddr
struct sockaddr_storage
{
sa_family_t ss_family;
+ char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)];
unsigned long __ss_align;
- char __ss_padding[128-2*sizeof(unsigned long)];
};
int socket (int, int, int);