On Tue, Dec 29, 2020 at 03:42:20PM +0100, Sebastian Benoit wrote:
> Hi,
>
> claudios bgpd diff and florian mentioning rad(8) made me look into usr.sbin/
> for getifaddrs() usage. I think these need a NULL check as well.
>
> ok?
Looks OK to me.
> diff --git usr.sbin/ospf6d/parse.y usr.sbin/ospf6d/parse.y
> index f163e24149d..509aa2f2e88 100644
> --- usr.sbin/ospf6d/parse.y
> +++ usr.sbin/ospf6d/parse.y
> @@ -1253,7 +1253,8 @@ get_rtr_id(void)
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> if (strncmp(ifa->ifa_name, "carp", 4) == 0)
> continue;
> - if (ifa->ifa_addr->sa_family != AF_INET)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET)
> continue;
> cur = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
> if ((cur & localnet) == localnet) /* skip 127/8 */
> diff --git usr.sbin/ospfd/parse.y usr.sbin/ospfd/parse.y
> index a09696504f8..3fbcca0c911 100644
> --- usr.sbin/ospfd/parse.y
> +++ usr.sbin/ospfd/parse.y
> @@ -1469,7 +1469,8 @@ get_rtr_id(void)
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> if (strncmp(ifa->ifa_name, "carp", 4) == 0)
> continue;
> - if (ifa->ifa_addr->sa_family != AF_INET)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET)
> continue;
> cur = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
> if ((cur & localnet) == localnet) /* skip 127/8 */
> diff --git usr.sbin/pppd/sys-bsd.c usr.sbin/pppd/sys-bsd.c
> index e8deee6d2ff..73f0e287938 100644
> --- usr.sbin/pppd/sys-bsd.c
> +++ usr.sbin/pppd/sys-bsd.c
> @@ -1334,6 +1334,8 @@ get_ether_addr(ipaddr, hwaddr)
> * address on the same subnet as `ipaddr'.
> */
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> + if (ifa->ifa_addr == NULL)
> + continue;
> if (ifa->ifa_addr->sa_family == AF_INET) {
> ina = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
> /*
> @@ -1367,6 +1369,8 @@ get_ether_addr(ipaddr, hwaddr)
> */
> ifp = ifa;
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> + if (ifa->ifa_addr == NULL)
> + continue;
> if (strcmp(ifp->ifa_name, ifa->ifa_name) == 0
> && ifa->ifa_addr->sa_family == AF_LINK) {
> /*
> @@ -1418,8 +1422,9 @@ GetMask(addr)
> /*
> * Check the interface's internet address.
> */
> - if (ifa->ifa_addr->sa_family != AF_INET)
> - continue;
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET)
> + continue;
> ina = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
> if ((ntohl(ina) & nmask) != (addr & nmask))
> continue;
> diff --git usr.sbin/rad/frontend.c usr.sbin/rad/frontend.c
> index b69e9b7b0a3..c4dcf46e068 100644
> --- usr.sbin/rad/frontend.c
> +++ usr.sbin/rad/frontend.c
> @@ -731,7 +731,8 @@ get_link_state(char *if_name)
> return LINK_STATE_UNKNOWN;
> }
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> - if (ifa->ifa_addr->sa_family != AF_LINK)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_LINK)
> continue;
> if (strcmp(if_name, ifa->ifa_name) != 0)
> continue;
> @@ -969,7 +970,8 @@ interface_has_linklocal_address(char *name)
> for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
> if (strcmp(name, ifa->ifa_name) != 0)
> continue;
> - if (ifa->ifa_addr->sa_family != AF_INET6)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET6)
> continue;
>
> sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
> @@ -1013,7 +1015,8 @@ get_interface_prefixes(struct ra_iface *ra_iface,
> struct ra_prefix_conf
> for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
> if (strcmp(ra_iface->name, ifa->ifa_name) != 0)
> continue;
> - if (ifa->ifa_addr->sa_family != AF_INET6)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET6)
> continue;
>
> sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
> diff --git usr.sbin/rarpd/rarpd.c usr.sbin/rarpd/rarpd.c
> index f3227883404..7652dcd3c4f 100644
> --- usr.sbin/rarpd/rarpd.c
> +++ usr.sbin/rarpd/rarpd.c
> @@ -200,6 +200,8 @@ init_all(void)
> error("getifaddrs: %s", strerror(errno));
>
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> + if (ifa->ifa_addr == NULL)
> + continue;
> sdl = (struct sockaddr_dl *)ifa->ifa_addr;
> if (sdl->sdl_family != AF_LINK || sdl->sdl_type != IFT_ETHER ||
> sdl->sdl_alen != 6)
> @@ -513,6 +515,8 @@ lookup_addrs(char *ifname, struct if_info *p)
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> if (strcmp(ifa->ifa_name, ifname))
> continue;
> + if (ifa->ifa_addr == NULL)
> + continue;
> sdl = (struct sockaddr_dl *) ifa->ifa_addr;
> if (sdl->sdl_family == AF_LINK &&
> sdl->sdl_type == IFT_ETHER && sdl->sdl_alen == 6) {
> diff --git usr.sbin/relayd/parse.y usr.sbin/relayd/parse.y
> index b20f2480752..55fe880ce3e 100644
> --- usr.sbin/relayd/parse.y
> +++ usr.sbin/relayd/parse.y
> @@ -3186,7 +3186,8 @@ host_if(const char *s, struct addresslist *al, int max,
>
> nextaf:
> for (p = ifap; p != NULL && cnt < max; p = p->ifa_next) {
> - if (p->ifa_addr->sa_family != af ||
> + if (p->ifa_addr == NULL ||
> + p->ifa_addr->sa_family != af ||
> (strcmp(s, p->ifa_name) != 0 &&
> !is_if_in_group(p->ifa_name, s)))
> continue;
> diff --git usr.sbin/route6d/route6d.c usr.sbin/route6d/route6d.c
> index ee1cf0b6d1c..7c8b9105e5e 100644
> --- usr.sbin/route6d/route6d.c
> +++ usr.sbin/route6d/route6d.c
> @@ -1370,7 +1370,8 @@ ifconfig(void)
> }
>
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> - if (ifa->ifa_addr->sa_family != AF_INET6)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET6)
> continue;
> ifcp = ifc_find(ifa->ifa_name);
> /* we are interested in multicast-capable interfaces */
> diff --git usr.sbin/ypbind/ypbind.c usr.sbin/ypbind/ypbind.c
> index a4ce3f62ff1..3e5498fb3aa 100644
> --- usr.sbin/ypbind/ypbind.c
> +++ usr.sbin/ypbind/ypbind.c
> @@ -757,7 +757,8 @@ broadcast(struct _dom_binding *ypdb, char *buf, int
> outlen)
> return -1;
> }
> for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> - if (ifa->ifa_addr->sa_family != AF_INET)
> + if (ifa->ifa_addr == NULL ||
> + ifa->ifa_addr->sa_family != AF_INET)
> continue;
> if ((ifa->ifa_flags & IFF_UP) == 0)
> continue;
>
--
:wq Claudio