Skip to content

Commit

Permalink
daemon.c: avoid accessing ss_family member of struct sockaddr_storage
Browse files Browse the repository at this point in the history
When NO_SOCKADDR_STORAGE is set for a platform, either sockaddr_in or
sockaddr_in6 is used intead.  Neither of which has an ss_family member.
They have an sin_family and sin6_family member respectively.  Since the
addrcmp() function accesses the ss_family member of a sockaddr_storage
struct, compilation fails on platforms which define NO_SOCKADDR_STORAGE.

Since any sockaddr_* structure can be cast to a struct sockaddr and
have its sa_family member read, do so here to workaround this issue.

Thanks to Martin Storsjö for pointing out the fix, and Gary Vaughan
for drawing attention to the issue.

Signed-off-by: Brandon Casey <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
drafnel authored and gitster committed Mar 17, 2010
1 parent 8fcaca3 commit 3aff874
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,14 +590,17 @@ static int execute(struct sockaddr *addr)
static int addrcmp(const struct sockaddr_storage *s1,
const struct sockaddr_storage *s2)
{
if (s1->ss_family != s2->ss_family)
return s1->ss_family - s2->ss_family;
if (s1->ss_family == AF_INET)
const struct sockaddr *sa1 = (const struct sockaddr*) s1;
const struct sockaddr *sa2 = (const struct sockaddr*) s2;

if (sa1->sa_family != sa2->sa_family)
return sa1->sa_family - sa2->sa_family;
if (sa1->sa_family == AF_INET)
return memcmp(&((struct sockaddr_in *)s1)->sin_addr,
&((struct sockaddr_in *)s2)->sin_addr,
sizeof(struct in_addr));
#ifndef NO_IPV6
if (s1->ss_family == AF_INET6)
if (sa1->sa_family == AF_INET6)
return memcmp(&((struct sockaddr_in6 *)s1)->sin6_addr,
&((struct sockaddr_in6 *)s2)->sin6_addr,
sizeof(struct in6_addr));
Expand Down

0 comments on commit 3aff874

Please sign in to comment.