]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
i->ifa_addr may not be aligned
authorAlan T. DeKok <aland@freeradius.org>
Mon, 28 Mar 2022 14:29:27 +0000 (10:29 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 28 Mar 2022 16:16:40 +0000 (12:16 -0400)
on OSX it fails with alignment issues, as apparently the alignment
requirements are different for sockaddr and sockaddr_storage?

Or at least ubsan complains on my Mac.

src/lib/util/inet.c

index 792079fb8a688573a3c7146d84e37c5c83f61c33..67616238dc4621f19c76df31d271eebae0d45a77 100644 (file)
@@ -1508,12 +1508,14 @@ int fr_interface_to_ipaddr(char const *interface, fr_ipaddr_t *ipaddr, int af, b
 
        for (i = list; i != NULL; i = i->ifa_next) {
                fr_ipaddr_t my_ipaddr;
+               struct sockaddr_storage sa;
 
                if (!i->ifa_addr || !i->ifa_name || ((af != AF_UNSPEC) && (af != i->ifa_addr->sa_family))) continue;
                if (strcmp(i->ifa_name, interface) != 0) continue;
 
-               fr_ipaddr_from_sockaddr(&my_ipaddr, NULL,
-                                       (struct sockaddr_storage *)i->ifa_addr, sizeof(struct sockaddr_in6));
+               memcpy(&sa, i->ifa_addr,  sizeof(struct sockaddr_in6)); /* ifa->ifa_addr may not be aligned properly */
+
+               fr_ipaddr_from_sockaddr(&my_ipaddr, NULL, &sa, sizeof(struct sockaddr_in6));
 
                /*
                 *      If they ask for a link local address, then give