Re: [PATCH v2] socket: Implement sockaddr_storage with an anonymous union

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

 



Hi Bastien,

On 1/20/23 21:32, Bastien Roucariès wrote:
[...]

diff --git a/bits/socket.h b/bits/socket.h
index aac8c49b00..c0c23b4e84 100644
--- a/bits/socket.h
+++ b/bits/socket.h
@@ -168,9 +168,14 @@ struct sockaddr
struct sockaddr_storage
    {
-    __SOCKADDR_COMMON (ss_);	/* Address family, etc.  */
-    char __ss_padding[_SS_PADSIZE];
-    __ss_aligntype __ss_align;	/* Force desired alignment.  */
no this is not correct you break ABI by reducing size
+    union
+      {
+        __SOCKADDR_COMMON (ss_);	/* Address family, etc.  */
+        struct sockaddr      sa;
+        struct sockaddr_in   sin;
+        struct sockaddr_in6  sin6;
+        struct sockaddr_un   sun;
+      };
    };

Correct one structure is

struct __private_sock_storage {
     __SOCKADDR_COMMON (ssprivate_);   /* Address family, etc. */
     char __ss_padding[_SS_PADSIZE];
     __ss_aligntype __ss_align; /* Force desired alignment. */
}

What is this structure for? I expect that it's for declaring a wide-enough and correctly aligned type, but the union containing all the other types already guarantees a size as wide as any other sockaddr_* and with the widest alignment.

Also, any member that is necessary for superalignment or padding could be added at the end of sockaddr_storage, after the anon union; you don't need the extra struct, I guess.

Right?


  struct sockaddr_storage
    {
        union
       {
          __SOCKADDR_COMMON (ss_);       /* Address family, etc. */
         struct sockaddr      sa;
          struct sockaddr_in   sin;
         struct sockaddr_in6  sin6;
         struct sockaddr_un   sun;
         struct __private_sock_storage _private;
       };
};

May it could be dropped later using align construct for modern C and padding


Cheers,

Alex

Bastien


--
<http://www.alejandro-colomar.es/>

Attachment: OpenPGP_signature
Description: OpenPGP digital signature


[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