Module Name:    src
Committed By:   ozaki-r
Date:           Tue Feb  7 02:38:08 UTC 2017

Modified Files:
        src/sys/netinet: if_arp.c ip_flow.c ip_icmp.c ip_input.c tcp_input.c
        src/sys/netinet6: icmp6.c mld6.c

Log Message:
Add missing NULL checks for m_get_rcvif


To generate a diff of this commit:
cvs rdiff -u -r1.240 -r1.241 src/sys/netinet/if_arp.c
cvs rdiff -u -r1.79 -r1.80 src/sys/netinet/ip_flow.c
cvs rdiff -u -r1.156 -r1.157 src/sys/netinet/ip_icmp.c
cvs rdiff -u -r1.348 -r1.349 src/sys/netinet/ip_input.c
cvs rdiff -u -r1.353 -r1.354 src/sys/netinet/tcp_input.c
cvs rdiff -u -r1.207 -r1.208 src/sys/netinet6/icmp6.c
cvs rdiff -u -r1.80 -r1.81 src/sys/netinet6/mld6.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.240 src/sys/netinet/if_arp.c:1.241
--- src/sys/netinet/if_arp.c:1.240	Tue Jan 24 07:09:24 2017
+++ src/sys/netinet/if_arp.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.240 2017/01/24 07:09:24 ozaki-r Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.241 2017/02/07 02:38:08 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.240 2017/01/24 07:09:24 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.241 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -941,6 +941,10 @@ arpintr(void)
 			goto badlen;
 
 		rcvif = m_get_rcvif(m, &s);
+		if (__predict_false(rcvif == NULL)) {
+			ARP_STATINC(ARP_STAT_RCVNOINT);
+			goto free;
+		}
 		switch (rcvif->if_type) {
 		case IFT_IEEE1394:
 			arplen = sizeof(struct arphdr) +
@@ -967,6 +971,7 @@ arpintr(void)
 badlen:
 			ARP_STATINC(ARP_STAT_RCVBADLEN);
 		}
+free:
 		m_freem(m);
 	}
 out:
@@ -1312,10 +1317,15 @@ reply:
 		struct llentry *lle = NULL;
 		struct sockaddr_in sin;
 #if NCARP > 0
-		struct ifnet *_rcvif = m_get_rcvif(m, &s);
-		if (ifp->if_type == IFT_CARP && _rcvif->if_type != IFT_CARP)
-			goto out;
-		m_put_rcvif(_rcvif, &s);
+		if (ifp->if_type == IFT_CARP) {
+			struct ifnet *_rcvif = m_get_rcvif(m, &s);
+			int iftype = 0;
+			if (__predict_true(_rcvif != NULL))
+				iftype = _rcvif->if_type;
+			m_put_rcvif(_rcvif, &s);
+			if (iftype != IFT_CARP)
+				goto out;
+		}
 #endif
 
 		tha = ar_tha(ah);
@@ -1877,6 +1887,8 @@ in_revarpinput(struct mbuf *m)
 	op = ntohs(ah->ar_op);
 
 	rcvif = m_get_rcvif(m, &s);
+	if (__predict_false(rcvif == NULL))
+		goto out;
 	switch (rcvif->if_type) {
 	case IFT_IEEE1394:
 		/* ARP without target hardware address is not supported */

Index: src/sys/netinet/ip_flow.c
diff -u src/sys/netinet/ip_flow.c:1.79 src/sys/netinet/ip_flow.c:1.80
--- src/sys/netinet/ip_flow.c:1.79	Wed Jan 11 13:08:29 2017
+++ src/sys/netinet/ip_flow.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_flow.c,v 1.79 2017/01/11 13:08:29 ozaki-r Exp $	*/
+/*	$NetBSD: ip_flow.c,v 1.80 2017/02/07 02:38:08 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.79 2017/01/11 13:08:29 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.80 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -247,6 +247,8 @@ ipflow_fastforward(struct mbuf *m)
 		goto out;
 
 	ifp = m_get_rcvif(m, &s);
+	if (__predict_false(ifp == NULL))
+		goto out_unref;
 	/*
 	 * Verify the IP header checksum.
 	 */

Index: src/sys/netinet/ip_icmp.c
diff -u src/sys/netinet/ip_icmp.c:1.156 src/sys/netinet/ip_icmp.c:1.157
--- src/sys/netinet/ip_icmp.c:1.156	Thu Feb  2 02:52:10 2017
+++ src/sys/netinet/ip_icmp.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_icmp.c,v 1.156 2017/02/02 02:52:10 ozaki-r Exp $	*/
+/*	$NetBSD: ip_icmp.c,v 1.157 2017/02/07 02:38:08 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -94,7 +94,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.156 2017/02/02 02:52:10 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.157 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ipsec.h"
@@ -562,7 +562,7 @@ _icmp_input(struct mbuf *m, int hlen, in
 	case ICMP_MASKREQ: {
 		struct ifnet *rcvif;
 		int s, ss;
-		struct ifaddr *ifa;
+		struct ifaddr *ifa = NULL;
 
 		if (icmpmaskrepl == 0)
 			break;
@@ -581,7 +581,8 @@ _icmp_input(struct mbuf *m, int hlen, in
 			icmpdst.sin_addr = ip->ip_dst;
 		ss = pserialize_read_enter();
 		rcvif = m_get_rcvif(m, &s);
-		ifa = ifaof_ifpforaddr(sintosa(&icmpdst), rcvif);
+		if (__predict_true(rcvif != NULL))
+			ifa = ifaof_ifpforaddr(sintosa(&icmpdst), rcvif);
 		m_put_rcvif(rcvif, &s);
 		if (ifa == NULL) {
 			pserialize_read_exit(ss);

Index: src/sys/netinet/ip_input.c
diff -u src/sys/netinet/ip_input.c:1.348 src/sys/netinet/ip_input.c:1.349
--- src/sys/netinet/ip_input.c:1.348	Tue Jan 24 07:09:24 2017
+++ src/sys/netinet/ip_input.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_input.c,v 1.348 2017/01/24 07:09:24 ozaki-r Exp $	*/
+/*	$NetBSD: ip_input.c,v 1.349 2017/02/07 02:38:08 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.348 2017/01/24 07:09:24 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.349 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -908,7 +908,7 @@ ip_dooptions(struct mbuf *m)
 	int opt, optlen, cnt, off, code, type = ICMP_PARAMPROB, forward = 0;
 	struct in_addr dst;
 	n_time ntime;
-	struct ifaddr *ifa;
+	struct ifaddr *ifa = NULL;
 	int s;
 
 	dst = ip->ip_dst;
@@ -1098,7 +1098,10 @@ ip_dooptions(struct mbuf *m)
 				ipaddr.sin_addr = dst;
 				_ss = pserialize_read_enter();
 				rcvif = m_get_rcvif(m, &_s);
-				ifa = ifaof_ifpforaddr(sintosa(&ipaddr), rcvif);
+				if (__predict_true(rcvif != NULL)) {
+					ifa = ifaof_ifpforaddr(sintosa(&ipaddr),
+					    rcvif);
+				}
 				m_put_rcvif(rcvif, &_s);
 				if (ifa == NULL) {
 					pserialize_read_exit(_ss);

Index: src/sys/netinet/tcp_input.c
diff -u src/sys/netinet/tcp_input.c:1.353 src/sys/netinet/tcp_input.c:1.354
--- src/sys/netinet/tcp_input.c:1.353	Wed Jan  4 12:35:14 2017
+++ src/sys/netinet/tcp_input.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_input.c,v 1.353 2017/01/04 12:35:14 kre Exp $	*/
+/*	$NetBSD: tcp_input.c,v 1.354 2017/02/07 02:38:08 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.353 2017/01/04 12:35:14 kre Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.354 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -904,6 +904,8 @@ tcp_input_checksum(int af, struct mbuf *
 	 */
 
 	rcvif = m_get_rcvif(m, &s);
+	if (__predict_false(rcvif == NULL))
+		goto badcsum; /* XXX */
 
 	switch (af) {
 #ifdef INET

Index: src/sys/netinet6/icmp6.c
diff -u src/sys/netinet6/icmp6.c:1.207 src/sys/netinet6/icmp6.c:1.208
--- src/sys/netinet6/icmp6.c:1.207	Thu Feb  2 02:52:10 2017
+++ src/sys/netinet6/icmp6.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: icmp6.c,v 1.207 2017/02/02 02:52:10 ozaki-r Exp $	*/
+/*	$NetBSD: icmp6.c,v 1.208 2017/02/07 02:38:08 ozaki-r Exp $	*/
 /*	$KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.207 2017/02/02 02:52:10 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.208 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1067,6 +1067,8 @@ icmp6_notify_error(struct mbuf *m, int o
 		eip6 = (struct ip6_hdr *)(icmp6 + 1);
 
 		rcvif = m_get_rcvif(m, &s);
+		if (__predict_false(rcvif == NULL))
+			goto freeit;
 		sockaddr_in6_init(&icmp6dst,
 		    (finaldst == NULL) ? &eip6->ip6_dst : finaldst, 0, 0, 0);
 		if (in6_setscope(&icmp6dst.sin6_addr, rcvif, NULL)) {
@@ -1164,6 +1166,8 @@ icmp6_mtudisc_update(struct ip6ctlparam 
 	sin6.sin6_len = sizeof(struct sockaddr_in6);
 	sin6.sin6_addr = *dst;
 	rcvif = m_get_rcvif(m, &s);
+	if (__predict_false(rcvif == NULL))
+		return;
 	if (in6_setscope(&sin6.sin6_addr, rcvif, NULL)) {
 		m_put_rcvif(rcvif, &s);
 		return;
@@ -1307,6 +1311,8 @@ ni6_input(struct mbuf *m, int off)
 			m_copydata(m, off + sizeof(struct icmp6_nodeinfo),
 			    subjlen, (void *)&in6_subj);
 			rcvif = m_get_rcvif(m, &s);
+			if (__predict_false(rcvif == NULL))
+				goto bad;
 			if (in6_setscope(&in6_subj, rcvif, NULL)) {
 				m_put_rcvif(rcvif, &s);
 				goto bad;

Index: src/sys/netinet6/mld6.c
diff -u src/sys/netinet6/mld6.c:1.80 src/sys/netinet6/mld6.c:1.81
--- src/sys/netinet6/mld6.c:1.80	Tue Jan 24 07:09:25 2017
+++ src/sys/netinet6/mld6.c	Tue Feb  7 02:38:08 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: mld6.c,v 1.80 2017/01/24 07:09:25 ozaki-r Exp $	*/
+/*	$NetBSD: mld6.c,v 1.81 2017/02/07 02:38:08 ozaki-r Exp $	*/
 /*	$KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $	*/
 
 /*
@@ -102,7 +102,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.80 2017/01/24 07:09:25 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.81 2017/02/07 02:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -345,6 +345,8 @@ mld_input(struct mbuf *m, int off)
 	int s;
 
 	ifp = m_get_rcvif(m, &s);
+	if (__predict_false(ifp == NULL))
+		goto out;
 	IP6_EXTHDR_GET(mldh, struct mld_hdr *, m, off, sizeof(*mldh));
 	if (mldh == NULL) {
 		ICMP6_STATINC(ICMP6_STAT_TOOSHORT);

Reply via email to