On Sat, Mar 30, 2019 at 08:05:41PM -0700, Hal Murray wrote:
> > A sockaddr is not meant to store the address, ...
> 
> But the API wants a sockaddr.
>        int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
> There is no hint in the man page that an IPv6 address won't fit.
> 
> sockaddr ends with
>   sa_data[14];

POSIX defines it as "char sa_data[]" and that it is variable
length. You should really use any of the other compatible sockaddr
structs and cast it to a struct sockaddr *.

> That's not big enough for an IPv6 address.  I assume somebody suggested 
> making it bigger and/or changing the parameters to accept when IPv6 was 
> added.  It would be interesting to review that discussion.

Nobody suggested that sockaddr was ever something that can hold an
IPv4 address or UNIX domain socket, it was never designed to hold
that. Instead you always had the give the proper type and cast it.
A sockaddr_storage was added as part of adding IPv6 support.

If you really want to know all kinds of historic information about
such things, I suggest you read Stevens' TCP/IP Illustrated.


Kurt

_______________________________________________
devel mailing list
devel@ntpsec.org
http://lists.ntpsec.org/mailman/listinfo/devel

Reply via email to