diff options
Diffstat (limited to 'sys/net')
| -rw-r--r-- | sys/net/altq/altq_cbq.c | 2 | ||||
| -rw-r--r-- | sys/net/altq/altq_fairq.c | 2 | ||||
| -rw-r--r-- | sys/net/altq/altq_priq.c | 2 | ||||
| -rw-r--r-- | sys/net/if.c | 34 | 
4 files changed, 32 insertions, 8 deletions
diff --git a/sys/net/altq/altq_cbq.c b/sys/net/altq/altq_cbq.c index bcba09267289..07c61fccb19b 100644 --- a/sys/net/altq/altq_cbq.c +++ b/sys/net/altq/altq_cbq.c @@ -172,6 +172,8 @@ cbq_request(struct ifaltq *ifq, int req, void *arg)  static void  get_class_stats(class_stats_t *statsp, struct rm_class *cl)  { +	memset(statsp, 0, sizeof(*statsp)); +  	statsp->xmit_cnt	= cl->stats_.xmit_cnt;  	statsp->drop_cnt	= cl->stats_.drop_cnt;  	statsp->over		= cl->stats_.over; diff --git a/sys/net/altq/altq_fairq.c b/sys/net/altq/altq_fairq.c index e20eea91b1a1..49046da24594 100644 --- a/sys/net/altq/altq_fairq.c +++ b/sys/net/altq/altq_fairq.c @@ -856,6 +856,8 @@ get_class_stats(struct fairq_classstats *sp, struct fairq_class *cl)  {  	fairq_bucket_t *b; +	memset(sp, 0, sizeof(*sp)); +  	sp->class_handle = cl->cl_handle;  	sp->qlimit = cl->cl_qlimit;  	sp->xmit_cnt = cl->cl_xmitcnt; diff --git a/sys/net/altq/altq_priq.c b/sys/net/altq/altq_priq.c index 32ebfdefbfbe..8023dc12e029 100644 --- a/sys/net/altq/altq_priq.c +++ b/sys/net/altq/altq_priq.c @@ -597,6 +597,8 @@ priq_purgeq(struct priq_class *cl)  static void  get_class_stats(struct priq_classstats *sp, struct priq_class *cl)  { +	memset(sp, 0, sizeof(*sp)); +  	sp->class_handle = cl->cl_handle;  	sp->qlength = qlen(cl->cl_q);  	sp->qlimit = qlimit(cl->cl_q); diff --git a/sys/net/if.c b/sys/net/if.c index 46ebabe09a51..c642e99136d8 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -2806,15 +2806,20 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)  		break;  	case SIOCAIFGROUP: +	{ +		const char *groupname; +  		error = priv_check(td, PRIV_NET_ADDIFGROUP);  		if (error)  			return (error); -		error = if_addgroup(ifp, -		    ((struct ifgroupreq *)data)->ifgr_group); +		groupname = ((struct ifgroupreq *)data)->ifgr_group; +		if (strnlen(groupname, IFNAMSIZ) == IFNAMSIZ) +			return (EINVAL); +		error = if_addgroup(ifp, groupname);  		if (error != 0)  			return (error);  		break; - +	}  	case SIOCGIFGROUP:  	{  		struct epoch_tracker et; @@ -2826,15 +2831,20 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)  	}  	case SIOCDIFGROUP: +	{ +		const char *groupname; +  		error = priv_check(td, PRIV_NET_DELIFGROUP);  		if (error)  			return (error); -		error = if_delgroup(ifp, -		    ((struct ifgroupreq *)data)->ifgr_group); +		groupname = ((struct ifgroupreq *)data)->ifgr_group; +		if (strnlen(groupname, IFNAMSIZ) == IFNAMSIZ) +			return (EINVAL); +		error = if_delgroup(ifp, groupname);  		if (error != 0)  			return (error);  		break; - +	}  	default:  		error = ENOIOCTL;  		break; @@ -2978,9 +2988,17 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td)  		goto out_noref;  	case SIOCGIFGMEMB: -		error = if_getgroupmembers((struct ifgroupreq *)data); -		goto out_noref; +	{ +		struct ifgroupreq *req; +		req = (struct ifgroupreq *)data; +		if (strnlen(req->ifgr_name, IFNAMSIZ) == IFNAMSIZ) { +			error = EINVAL; +			goto out_noref; +		} +		error = if_getgroupmembers(req); +		goto out_noref; +	}  #if defined(INET) || defined(INET6)  	case SIOCSVH:  	case SIOCGVH:  | 
