Re: struct sockaddr_storage, union (was: Improve getsockname)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Le jeudi 19 janvier 2023, 23:31:09 UTC Alejandro Colomar a écrit :
Hi,
> On 1/19/23 22:38, Bastien Roucariès wrote:
> 
> However... Considering that most APIs use `struct sockaddr *`, this wouldn't 
> allow the internal libc implementation of functions like getnameinfo(3) to be 
> free of UB.

libc is safe thanks to the transparent union of pointer.

> Maybe a better thing would be to do the following:
> 
> 
> struct sockaddr {
> 	union {
> 		struct {
> 			sa_family_t  sa_family;
> 			char         sa_data[];
> 		};
> 		struct sockaddr_in   sin;
> 		struct sockaddr_in6  sin6;
> 		struct sockaddr_un   sun;
> 	};
> };
> 
> struct sockaddr_storage {
> 	union {
> 		sa_family_t          ss_family;
> 		struct sockaddr      sa;
> 	};
> };
> 

No I think we could do better with recent C:
struct osockaddr
{
  unsigned short int sa_family;
  unsigned char sa_data[14];
  char _extra[];
};

> This makes sockaddr and sockaddr_storage have the same size, and also both can 
> alias any of the children types through the unions, so one can use either of 
> them for the same purpose.

We could not due to old talk protocol

Only storage is free
> 
> I'll be sending a patch soon for discussion.
> 
> Cheers,
> 
> Alex
> 
> > 
> >>
> >>>
> >>>    struct sockaddr_storage {
> >>> 	union {
> >>>    		sa_family_t          ss_family;
> >>>    		struct sockaddr      sa;
> >>>    		struct sockaddr_in   sin;
> >>>    		struct sockaddr_in6  sin6;
> >>>    		struct sockaddr_un   sun;
> >>>    	};
> >>>                          char __reserved_null;
> >>
> 
> -- 
> <http://www.alejandro-colomar.es/>
> 

Attachment: signature.asc
Description: This is a digitally signed message part.


[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux