summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorjlemon <jlemon@FreeBSD.org>2000-11-02 16:30:26 +0000
committerjlemon <jlemon@FreeBSD.org>2000-11-02 16:30:26 +0000
commit9ae2a2ef48f86cdcdee9cf44703c0b07bdc691c8 (patch)
treeb497203aa96436cbadf416216c3c135989a2b452 /sys/net
parent0400173d457e30cf1ef7f7c04a0c30af95ce19a0 (diff)
downloadFreeBSD-src-9ae2a2ef48f86cdcdee9cf44703c0b07bdc691c8.zip
FreeBSD-src-9ae2a2ef48f86cdcdee9cf44703c0b07bdc691c8.tar.gz
Have tuninit() return an error if an interface address is NULL.
SIOCGIFSTATUS was returning at splimp(); fix this. (to be MFC'd) Submitted by: Marius Bendiksen
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if_tun.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c
index f7a2f86..9187764 100644
--- a/sys/net/if_tun.c
+++ b/sys/net/if_tun.c
@@ -248,6 +248,7 @@ tuninit(ifp)
{
struct tun_softc *tp = ifp->if_softc;
register struct ifaddr *ifa;
+ int error = 0;
TUNDEBUG("%s%d: tuninit\n", ifp->if_name, ifp->if_unit);
@@ -256,21 +257,26 @@ tuninit(ifp)
for (ifa = ifp->if_addrhead.tqh_first; ifa;
ifa = ifa->ifa_link.tqe_next) {
+ if (ifa->ifa_addr == NULL)
+ error = EFAULT;
+ /* XXX: Should maybe return straight off? */
+ else {
#ifdef INET
- if (ifa->ifa_addr->sa_family == AF_INET) {
- struct sockaddr_in *si;
+ if (ifa->ifa_addr->sa_family == AF_INET) {
+ struct sockaddr_in *si;
- si = (struct sockaddr_in *)ifa->ifa_addr;
- if (si && si->sin_addr.s_addr)
- tp->tun_flags |= TUN_IASET;
+ si = (struct sockaddr_in *)ifa->ifa_addr;
+ if (si->sin_addr.s_addr)
+ tp->tun_flags |= TUN_IASET;
- si = (struct sockaddr_in *)ifa->ifa_dstaddr;
- if (si && si->sin_addr.s_addr)
- tp->tun_flags |= TUN_DSTADDR;
- }
+ si = (struct sockaddr_in *)ifa->ifa_dstaddr;
+ if (si && si->sin_addr.s_addr)
+ tp->tun_flags |= TUN_DSTADDR;
+ }
#endif
+ }
}
- return 0;
+ return (error);
}
/*
@@ -294,16 +300,16 @@ tunifioctl(ifp, cmd, data)
if (tp->tun_pid)
sprintf(ifs->ascii + strlen(ifs->ascii),
"\tOpened by PID %d\n", tp->tun_pid);
- return(0);
+ break;
case SIOCSIFADDR:
- tuninit(ifp);
- TUNDEBUG("%s%d: address set\n",
- ifp->if_name, ifp->if_unit);
+ error = tuninit(ifp);
+ TUNDEBUG("%s%d: address set, error=%d\n",
+ ifp->if_name, ifp->if_unit, error);
break;
case SIOCSIFDSTADDR:
- tuninit(ifp);
- TUNDEBUG("%s%d: destination address set\n",
- ifp->if_name, ifp->if_unit);
+ error = tuninit(ifp);
+ TUNDEBUG("%s%d: destination address set, error=%d\n",
+ ifp->if_name, ifp->if_unit, error);
break;
case SIOCSIFMTU:
ifp->if_mtu = ifr->ifr_mtu;
@@ -313,8 +319,6 @@ tunifioctl(ifp, cmd, data)
case SIOCADDMULTI:
case SIOCDELMULTI:
break;
-
-
default:
error = EINVAL;
}
OpenPOWER on IntegriCloud