X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=support%2Finclude%2Fsockaddr.h;h=72766db60eedcffd5d3afdf96fa14148623b92f8;hb=19024076a7497a2423ff06d36496385f27395332;hp=732514be6c747a2ce981a89b77ffeee372c63ce6;hpb=f0d3a4bedccca7cce48296757bc1c8bd59b80828;p=nfs-utils.git diff --git a/support/include/sockaddr.h b/support/include/sockaddr.h index 732514b..72766db 100644 --- a/support/include/sockaddr.h +++ b/support/include/sockaddr.h @@ -20,6 +20,7 @@ #ifndef NFS_UTILS_SOCKADDR_H #define NFS_UTILS_SOCKADDR_H +#include #include #include #include @@ -192,16 +193,14 @@ compare_sockaddr6(const struct sockaddr *sa1, const struct sockaddr *sa2) { const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1; const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2; + const struct in6_addr *saddr1 = &sin1->sin6_addr; + const struct in6_addr *saddr2 = &sin2->sin6_addr; - if ((IN6_IS_ADDR_LINKLOCAL((char *)&sin1->sin6_addr) && - IN6_IS_ADDR_LINKLOCAL((char *)&sin2->sin6_addr)) || - (IN6_IS_ADDR_SITELOCAL((char *)&sin1->sin6_addr) && - IN6_IS_ADDR_SITELOCAL((char *)&sin2->sin6_addr))) + if (IN6_IS_ADDR_LINKLOCAL(saddr1) && IN6_IS_ADDR_LINKLOCAL(saddr2)) if (sin1->sin6_scope_id != sin2->sin6_scope_id) return false; - return IN6_ARE_ADDR_EQUAL((char *)&sin1->sin6_addr, - (char *)&sin2->sin6_addr); + return IN6_ARE_ADDR_EQUAL(saddr1, saddr2); } #else /* !IPV6_SUPPORTED */ static inline _Bool @@ -223,6 +222,9 @@ compare_sockaddr6(__attribute__ ((unused)) const struct sockaddr *sa1, static inline _Bool nfs_compare_sockaddr(const struct sockaddr *sa1, const struct sockaddr *sa2) { + if (sa1 == NULL || sa2 == NULL) + return false; + if (sa1->sa_family == sa2->sa_family) switch (sa1->sa_family) { case AF_INET: