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

Reply via email to