Skip to content

Commit

Permalink
Don't depend on sa_len sockaddr field
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
greghudson committed Jul 4, 2014
1 parent dc04419 commit 1fde9a6
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 17 deletions.
2 changes: 1 addition & 1 deletion src/clients/klist/klist.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
20 changes: 12 additions & 8 deletions src/include/socket-utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
4 changes: 2 additions & 2 deletions src/lib/apputils/net-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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));
Expand Down
6 changes: 3 additions & 3 deletions src/lib/krb5/os/localaddr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/lib/rpc/bindresvport.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/lib/rpc/svc_tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/rpc/svc_udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 1fde9a6

Please sign in to comment.