]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Don't depend on sa_len sockaddr field
authorGreg Hudson <ghudson@mit.edu>
Thu, 3 Jul 2014 16:17:25 +0000 (12:17 -0400)
committerGreg Hudson <ghudson@mit.edu>
Fri, 4 Jul 2014 19:14:02 +0000 (15:14 -0400)
In socket-utils.h, replace the socklen macro with an inline function
sa_socklen which always uses the address family, even on platforms
with the sa_len sockaddr field.  This removes the need to set sa_len
in socket addresses we construct.

src/clients/klist/klist.c
src/include/socket-utils.h
src/lib/apputils/net-server.c
src/lib/krb5/os/localaddr.c
src/lib/rpc/bindresvport.c
src/lib/rpc/svc_tcp.c
src/lib/rpc/svc_udp.c

index 15e75bb8c6bef17b39cd9fd5e09c8e37df360a15..9388d1406758691fd117ee61b5c3bfea77d4bd4e 100644 (file)
@@ -846,7 +846,7 @@ void one_addr(a)
     }
 
     namebuf[0] = 0;
-    err = getnameinfo (ss2sa (&ss), socklen (ss2sa (&ss)),
+    err = getnameinfo (ss2sa (&ss), sa_socklen (ss2sa (&ss)),
                        namebuf, sizeof (namebuf), 0, 0,
                        no_resolve ? NI_NUMERICHOST : 0U);
     if (err) {
index e3fa4293bba1bf5630fe8bcbb7770530efcc5ffc..15666368304732a30d5bca697d5fd0e3a62d72bd 100644 (file)
@@ -119,13 +119,17 @@ sa_is_inet(struct sockaddr *sa)
     return sa->sa_family == AF_INET || sa->sa_family == AF_INET6;
 }
 
-#if !defined (socklen)
-/* socklen_t socklen (struct sockaddr *) */
-#  ifdef HAVE_SA_LEN
-#    define socklen(X) ((X)->sa_len)
-#  else
-#    define socklen(X) ((X)->sa_family == AF_INET6 ? (socklen_t) sizeof (struct sockaddr_in6) : (X)->sa_family == AF_INET ? (socklen_t) sizeof (struct sockaddr_in) : (socklen_t) sizeof (struct sockaddr))
-#  endif
-#endif
+/* Return the length of an IPv4 or IPv6 socket structure; abort if it is
+ * neither. */
+static inline socklen_t
+sa_socklen(struct sockaddr *sa)
+{
+    if (sa->sa_family == AF_INET6)
+        return sizeof(struct sockaddr_in6);
+    else if (sa->sa_family == AF_INET)
+        return sizeof(struct sockaddr_in);
+    else
+        abort();
+}
 
 #endif /* SOCKET_UTILS_H */
index 2dd435b76165bb575b582753896a4c98c064b3ce..558eee34cfcb9e49f113694698ecf12c5ba7657d 100644 (file)
@@ -139,7 +139,7 @@ paddr(struct sockaddr *sa)
 {
     static char buf[100];
     char portbuf[10];
-    if (getnameinfo(sa, socklen(sa),
+    if (getnameinfo(sa, sa_socklen(sa),
                     buf, sizeof(buf), portbuf, sizeof(portbuf),
                     NI_NUMERICHOST|NI_NUMERICSERV))
         strlcpy(buf, "<unprintable>", sizeof(buf));
@@ -592,7 +592,7 @@ create_server_socket(struct socksetup *data, struct sockaddr *addr, int type)
 #endif /* IPV6_V6ONLY */
     }
 
-    if (bind(sock, addr, socklen(addr)) == -1) {
+    if (bind(sock, addr, sa_socklen(addr)) == -1) {
         data->retval = errno;
         com_err(data->prog, errno, _("Cannot bind server socket on %s"),
                 paddr(addr));
index f7eb2d240c9956db7c12042852854c78decfcb8a..0e6a05c664d825a6c7ae7daa7b5ac9a635f01c2a 100644 (file)
@@ -165,7 +165,7 @@ printaddr(struct sockaddr *sa)
     int err;
 
     printf ("%p ", (void *) sa);
-    err = getnameinfo (sa, socklen (sa), buf, sizeof (buf), 0, 0,
+    err = getnameinfo (sa, sa_socklen (sa), buf, sizeof (buf), 0, 0,
                        NI_NUMERICHOST);
     if (err)
         printf ("<getnameinfo error %d: %s> family=%d",
@@ -1085,7 +1085,7 @@ static int print_addr (/*@unused@*/ void *dataptr, struct sockaddr *sa)
     socklen_t len;
 
     printf ("  --> family %2d ", sa->sa_family);
-    len = socklen (sa);
+    len = sa_socklen (sa);
     err = getnameinfo (sa, len, hostbuf, (socklen_t) sizeof (hostbuf),
                        (char *) NULL, 0, NI_NUMERICHOST);
     if (err) {
@@ -1423,7 +1423,7 @@ get_localaddrs (krb5_context context, krb5_address ***addr, int use_profile)
             }
             if (addrp)
                 memcpy (addrp, addr[0][j]->contents, addr[0][j]->length);
-            err2 = getnameinfo (ss2sa(&ss), socklen (ss2sa (&ss)),
+            err2 = getnameinfo (ss2sa(&ss), sa_socklen (ss2sa (&ss)),
                                 namebuf, sizeof (namebuf), 0, 0,
                                 NI_NUMERICHOST);
             if (err2 == 0)
index fa28b60718be6c4a90bbeeb0c532f078aaf0641f..ba11e0a8b3e59ef99ef599d9331eee4ed48a4be7 100644 (file)
@@ -81,7 +81,7 @@ bindresvport_sa(int sd, struct sockaddr *sa)
                if (port > ENDPORT) {
                        port = STARTPORT;
                }
-               res = bind(sd, sa, socklen(sa));
+               res = bind(sd, sa, sa_socklen(sa));
        }
        return (res);
 }
index 7b69c33da9690d0771c5fb01d02bdba32877c89e..3d02164817574b1168c59a233252681b3ac9e0ee 100644 (file)
@@ -174,7 +174,7 @@ svctcp_create(
 
        if (bindresvport_sa(sock, sa)) {
                sa_setport(sa, 0);
-               (void)bind(sock, sa, socklen(sa));
+               (void)bind(sock, sa, sa_socklen(sa));
        }
        len = sizeof(struct sockaddr_storage);
        if (getsockname(sock, sa, &len) != 0) {
index e9f1c3d0088eab638a84a3ca08dd0a92e11eccb1..603f56a0bc0dd821e9b962cd71b7301aa4fa496b 100644 (file)
@@ -145,7 +145,7 @@ svcudp_bufcreate(
 
        if (bindresvport_sa(sock, sa)) {
                sa_setport(sa, 0);
-               (void)bind(sock, sa, socklen(sa));
+               (void)bind(sock, sa, sa_socklen(sa));
        }
        len = sizeof(struct sockaddr_storage);
        if (getsockname(sock, sa, &len) != 0) {