use if_indexlim (instead of if_index) and ifindex2ifnet[x] != NULL

to check if interface exists, as (1) if_index has different meaning
(2) ifindex2ifnet could become NULL when interface gets destroyed,
since when we have introduced dynamically-created interfaces.  from kame
This commit is contained in:
itojun 2003-12-10 11:46:33 +00:00
parent fbae381aaa
commit aa8a6718f0
8 changed files with 44 additions and 33 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: if.c,v 1.136 2003/12/04 19:38:24 atatat Exp $ */
/* $NetBSD: if.c,v 1.137 2003/12/10 11:46:33 itojun Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@ -97,7 +97,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.136 2003/12/04 19:38:24 atatat Exp $");
__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.137 2003/12/10 11:46:33 itojun Exp $");
#include "opt_inet.h"
@ -255,8 +255,9 @@ if_nulldrain(ifp)
/* Nothing. */
}
u_int if_index = 1;
static u_int if_index = 1;
struct ifnet_head ifnet;
size_t if_indexlim = 0;
struct ifaddr **ifnet_addrs = NULL;
struct ifnet **ifindex2ifnet = NULL;
@ -354,7 +355,6 @@ void
if_attach(ifp)
struct ifnet *ifp;
{
static size_t if_indexlim = 0;
int indexlim = 0;
if (if_indexlim == 0) {
@ -980,7 +980,8 @@ ifa_ifwithnet(addr)
if (af == AF_LINK) {
sdl = (struct sockaddr_dl *)addr;
if (sdl->sdl_index && sdl->sdl_index <= if_index &&
if (sdl->sdl_index && sdl->sdl_index < if_indexlim &&
ifindex2ifnet[sdl->sdl_index] &&
ifindex2ifnet[sdl->sdl_index]->if_output != if_nulloutput)
return (ifnet_addrs[sdl->sdl_index]);
}
@ -1296,7 +1297,7 @@ ifunit(name)
* If the number took all of the name, then it's a valid ifindex.
*/
if (i == IFNAMSIZ || (cp != name && *cp == '\0')) {
if (unit >= if_index)
if (unit >= if_indexlim)
return (NULL);
ifp = ifindex2ifnet[unit];
if (ifp == NULL || ifp->if_output == if_nulloutput)

View File

@ -1,4 +1,4 @@
/* $NetBSD: if.h,v 1.94 2003/11/28 08:56:48 keihan Exp $ */
/* $NetBSD: if.h,v 1.95 2003/12/10 11:46:33 itojun Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@ -736,7 +736,7 @@ extern struct ifnet **ifindex2ifnet;
#if 0
struct ifnet loif[];
#endif
extern u_int if_index;
extern size_t if_indexlim;
char *ether_sprintf __P((const u_char *));

View File

@ -1,4 +1,4 @@
/* $NetBSD: ip_output.c,v 1.128 2003/11/19 18:39:34 jonathan Exp $ */
/* $NetBSD: ip_output.c,v 1.129 2003/12/10 11:46:33 itojun Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@ -98,7 +98,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.128 2003/11/19 18:39:34 jonathan Exp $");
__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.129 2003/12/10 11:46:33 itojun Exp $");
#include "opt_pfil_hooks.h"
#include "opt_inet.h"
@ -1492,9 +1492,11 @@ ip_multicast_if(a, ifindexp)
*ifindexp = 0;
if (ntohl(a->s_addr) >> 24 == 0) {
ifindex = ntohl(a->s_addr) & 0xffffff;
if (ifindex < 0 || if_index < ifindex)
if (ifindex < 0 || if_indexlim <= ifindex)
return NULL;
ifp = ifindex2ifnet[ifindex];
if (!ifp)
return NULL;
if (ifindexp)
*ifindexp = ifindex;
} else {

View File

@ -1,4 +1,4 @@
/* $NetBSD: in6.c,v 1.83 2003/12/04 13:57:31 keihan Exp $ */
/* $NetBSD: in6.c,v 1.84 2003/12/10 11:46:33 itojun Exp $ */
/* $KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $ */
/*
@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.83 2003/12/04 13:57:31 keihan Exp $");
__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.84 2003/12/10 11:46:33 itojun Exp $");
#include "opt_inet.h"
@ -293,7 +293,7 @@ in6_ifindex2scopeid(idx)
struct ifaddr *ifa;
struct sockaddr_in6 *sin6;
if (idx < 0 || if_index < idx)
if (idx < 0 || if_indexlim <= idx)
return -1;
ifp = ifindex2ifnet[idx];
if (!ifp)

View File

@ -1,4 +1,4 @@
/* $NetBSD: in6_src.c,v 1.17 2003/09/04 09:17:08 itojun Exp $ */
/* $NetBSD: in6_src.c,v 1.18 2003/12/10 11:46:33 itojun Exp $ */
/* $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $ */
/*
@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.17 2003/09/04 09:17:08 itojun Exp $");
__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.18 2003/12/10 11:46:33 itojun Exp $");
#include "opt_inet.h"
@ -169,7 +169,8 @@ in6_selectsrc(dstsock, opts, mopts, ro, laddr, errorp)
* somewhere...
*/
if (dstsock->sin6_scope_id < 0 ||
if_index < dstsock->sin6_scope_id) {
if_indexlim <= dstsock->sin6_scope_id ||
!ifindex2ifnet[dstsock->sin6_scope_id]) {
*errorp = ENXIO; /* XXX: better error? */
return (0);
}
@ -464,7 +465,8 @@ in6_embedscope(in6, sin6, in6p, ifpp)
in6->s6_addr16[1] = htons(ifp->if_index);
} else if (scopeid) {
/* boundary check */
if (scopeid < 0 || if_index < scopeid)
if (scopeid < 0 || if_indexlim <= scopeid ||
!ifindex2ifnet[scopeid])
return ENXIO; /* XXX EINVAL? */
ifp = ifindex2ifnet[scopeid];
/* XXX assignment to 16bit from 32bit variable */
@ -508,7 +510,8 @@ in6_recoverscope(sin6, in6, ifp)
scopeid = ntohs(sin6->sin6_addr.s6_addr16[1]);
if (scopeid) {
/* sanity check */
if (scopeid < 0 || if_index < scopeid)
if (scopeid < 0 || if_indexlim <= scopeid ||
!ifindex2ifnet[scopeid])
return ENXIO;
if (ifp && ifp->if_index != scopeid)
return ENXIO;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ip6_mroute.c,v 1.59 2003/12/10 09:28:38 itojun Exp $ */
/* $NetBSD: ip6_mroute.c,v 1.60 2003/12/10 11:46:33 itojun Exp $ */
/* $KAME: ip6_mroute.c,v 1.49 2001/07/25 09:21:18 jinmei Exp $ */
/*
@ -117,7 +117,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ip6_mroute.c,v 1.59 2003/12/10 09:28:38 itojun Exp $");
__KERNEL_RCSID(0, "$NetBSD: ip6_mroute.c,v 1.60 2003/12/10 11:46:33 itojun Exp $");
#include "opt_inet.h"
#include "opt_mrouting.h"
@ -650,7 +650,8 @@ add_m6if(mifcp)
mifp = mif6table + mifcp->mif6c_mifi;
if (mifp->m6_ifp)
return EADDRINUSE; /* XXX: is it appropriate? */
if (mifcp->mif6c_pifi == 0 || mifcp->mif6c_pifi > if_index)
if (mifcp->mif6c_pifi == 0 || mifcp->mif6c_pifi >= if_indexlim ||
!ifindex2ifnet[mifcp->mif6c_pifi])
return ENXIO;
/*
* XXX: some OSes can remove ifp and clear ifindex2ifnet[id]

View File

@ -1,4 +1,4 @@
/* $NetBSD: ip6_output.c,v 1.73 2003/11/06 06:10:51 itojun Exp $ */
/* $NetBSD: ip6_output.c,v 1.74 2003/12/10 11:46:33 itojun Exp $ */
/* $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $ */
/*
@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.73 2003/11/06 06:10:51 itojun Exp $");
__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.74 2003/12/10 11:46:33 itojun Exp $");
#include "opt_inet.h"
#include "opt_ipsec.h"
@ -1714,7 +1714,8 @@ ip6_setmoptions(optname, im6op, m)
break;
}
bcopy(mtod(m, u_int *), &ifindex, sizeof(ifindex));
if (ifindex < 0 || if_index < ifindex) {
if (ifindex < 0 || if_indexlim <= ifindex ||
!ifindex2ifnet[ifindex]) {
error = ENXIO; /* XXX EINVAL? */
break;
}
@ -1793,7 +1794,8 @@ ip6_setmoptions(optname, im6op, m)
* If the interface is specified, validate it.
*/
if (mreq->ipv6mr_interface < 0 ||
if_index < mreq->ipv6mr_interface) {
if_indexlim <= mreq->ipv6mr_interface ||
!ifindex2ifnet[mreq->ipv6mr_interface]) {
error = ENXIO; /* XXX EINVAL? */
break;
}
@ -1892,8 +1894,9 @@ ip6_setmoptions(optname, im6op, m)
* If an interface address was specified, get a pointer
* to its ifnet structure.
*/
if (mreq->ipv6mr_interface < 0
|| if_index < mreq->ipv6mr_interface) {
if (mreq->ipv6mr_interface < 0 ||
if_indexlim <= mreq->ipv6mr_interface ||
!ifindex2ifnet[mreq->ipv6mr_interface]) {
error = ENXIO; /* XXX EINVAL? */
break;
}
@ -2058,8 +2061,9 @@ ip6_setpktoptions(control, opt, priv)
opt->ip6po_pktinfo->ipi6_addr.s6_addr16[1] =
htons(opt->ip6po_pktinfo->ipi6_ifindex);
if (opt->ip6po_pktinfo->ipi6_ifindex > if_index ||
opt->ip6po_pktinfo->ipi6_ifindex < 0) {
if (opt->ip6po_pktinfo->ipi6_ifindex >= if_indexlim ||
opt->ip6po_pktinfo->ipi6_ifindex < 0 ||
!ifindex2ifnet[opt->ip6po_pktinfo->ipi6_ifindex]) {
return (ENXIO);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nd6_rtr.c,v 1.46 2003/10/30 01:43:10 simonb Exp $ */
/* $NetBSD: nd6_rtr.c,v 1.47 2003/12/10 11:46:33 itojun Exp $ */
/* $KAME: nd6_rtr.c,v 1.95 2001/02/07 08:09:47 itojun Exp $ */
/*
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.46 2003/10/30 01:43:10 simonb Exp $");
__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.47 2003/12/10 11:46:33 itojun Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1983,7 +1983,7 @@ nd6_setdefaultiface(ifindex)
{
int error = 0;
if (ifindex < 0 || if_index < ifindex)
if (ifindex < 0 || if_indexlim <= ifindex || !ifindex2ifnet[ifindex])
return (EINVAL);
if (nd6_defifindex != ifindex) {