--- autod_nfs.orig.c 2008-04-09 19:25:45.000000000 +0000 +++ autod_nfs.c 2008-04-10 14:00:08.000000000 +0000 @@ -278,6 +278,7 @@ subnet_test(int af, int len, char *addr) { struct ifaddrs *ifalist, *ifa; + char *if_inaddr, *if_inmask, *if_indstaddr; if (getifaddrs(&ifalist)) return (0); @@ -285,22 +286,36 @@ for (ifa = ifalist; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr->sa_family != af) continue; +/* WRONG! if (ifa->ifa_addr->sa_len != len) continue; +*/ + if_inaddr = (af == AF_INET) ? + (char *) &(((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr) : + (char *) &(((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_addr); + if (ifa->ifa_dstaddr) { + if_indstaddr = (af == AF_INET) ? + (char *) &(((struct sockaddr_in *)(ifa->ifa_dstaddr))->sin_addr) : + (char *) &(((struct sockaddr_in6 *)(ifa->ifa_dstaddr))->sin6_addr); + } + if (ifa->ifa_netmask == 0) { - if (memcmp(ifa->ifa_addr->sa_data, addr, len) == 0 || - (ifa->ifa_dstaddr && memcmp(ifa->ifa_dstaddr->sa_data, addr, len) == 0)) { + if (memcmp(if_inaddr, addr, len) == 0 || + (ifa->ifa_dstaddr && memcmp(if_indstaddr, addr, len) == 0)) { freeifaddrs(ifalist); return (1); } } else { + if_inmask = (af == AF_INET) ? + (char *) &(((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr) : + (char *) &(((struct sockaddr_in6 *)(ifa->ifa_netmask))->sin6_addr); if (ifa->ifa_flags & IFF_POINTOPOINT) { - if (ifa->ifa_dstaddr && memcmp(ifa->ifa_dstaddr->sa_data, addr, len) == 0) { + if (ifa->ifa_dstaddr && memcmp(if_indstaddr, addr, len) == 0) { freeifaddrs(ifalist); return (1); } } else { - if (masked_eq(ifa->ifa_addr->sa_data, addr, ifa->ifa_netmask->sa_data, len)) { + if (masked_eq(if_inaddr, addr, if_inmask, len)) { freeifaddrs(ifalist); return (1); }