Date: Wed, 6 Nov 2013 08:36:08 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r257737 - head/sys/netinet Message-ID: <201311060836.rA68a8Zk084674@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Wed Nov 6 08:36:08 2013 New Revision: 257737 URL: http://svnweb.freebsd.org/changeset/base/257737 Log: Fix my braino in r257692. For SIOCG*ADDR we don't need exact match on specified address, actually in most cases the address isn't specified. Reported by: peter Modified: head/sys/netinet/in.c Modified: head/sys/netinet/in.c ============================================================================== --- head/sys/netinet/in.c Wed Nov 6 07:46:10 2013 (r257736) +++ head/sys/netinet/in.c Wed Nov 6 08:36:08 2013 (r257737) @@ -237,6 +237,7 @@ in_control(struct socket *so, u_long cmd { struct ifreq *ifr = (struct ifreq *)data; struct sockaddr_in *addr = (struct sockaddr_in *)&ifr->ifr_addr; + struct ifaddr *ifa; struct in_ifaddr *ia; int error; @@ -279,19 +280,25 @@ in_control(struct socket *so, u_long cmd return ((*ifp->if_ioctl)(ifp, cmd, data)); } + if (addr->sin_addr.s_addr != INADDR_ANY && + prison_check_ip4(td->td_ucred, &addr->sin_addr) != 0) + return (EADDRNOTAVAIL); + /* - * Find address for this interface, if it exists. + * For SIOCGIFADDR, pick the first address. For the rest of + * ioctls, try to find specified address. */ - IN_IFADDR_RLOCK(); - LIST_FOREACH(ia, INADDR_HASH(addr->sin_addr.s_addr), ia_hash) { - if (ia->ia_ifp == ifp && - ia->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr && - prison_check_ip4(td->td_ucred, &addr->sin_addr) == 0) + IF_ADDR_RLOCK(ifp); + TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { + ia = (struct in_ifaddr *)ifa; + if (cmd == SIOCGIFADDR || addr->sin_addr.s_addr == INADDR_ANY) + break; + if (ia->ia_addr.sin_addr.s_addr == addr->sin_addr.s_addr) break; } - if (ia == NULL) { - IN_IFADDR_RUNLOCK(); + if (ifa == NULL) { + IF_ADDR_RUNLOCK(ifp); return (EADDRNOTAVAIL); } @@ -322,7 +329,7 @@ in_control(struct socket *so, u_long cmd break; } - IN_IFADDR_RUNLOCK(); + IF_ADDR_RUNLOCK(ifp); return (error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311060836.rA68a8Zk084674>