Browse Source

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.
master
Rich Felker 10 years ago
parent
commit
1e6fc0b690
  1. 2
      include/sys/socket.h

2
include/sys/socket.h

@ -306,8 +306,8 @@ struct sockaddr
struct sockaddr_storage struct sockaddr_storage
{ {
sa_family_t ss_family; sa_family_t ss_family;
char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)];
unsigned long __ss_align; unsigned long __ss_align;
char __ss_padding[128-2*sizeof(unsigned long)];
}; };
int socket (int, int, int); int socket (int, int, int);

Loading…
Cancel
Save