Module Name:    src
Committed By:   ozaki-r
Date:           Mon Apr 25 14:38:08 UTC 2016

Modified Files:
        src/sys/net: route.c rtsock.c
        src/sys/netinet: if_arp.c
        src/sys/netinet6: nd6.c

Log Message:
Check error of rt_setgate and rt_settag


To generate a diff of this commit:
cvs rdiff -u -r1.163 -r1.164 src/sys/net/route.c
cvs rdiff -u -r1.183 -r1.184 src/sys/net/rtsock.c
cvs rdiff -u -r1.208 -r1.209 src/sys/netinet/if_arp.c
cvs rdiff -u -r1.191 -r1.192 src/sys/netinet6/nd6.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/net/route.c
diff -u src/sys/net/route.c:1.163 src/sys/net/route.c:1.164
--- src/sys/net/route.c:1.163	Mon Apr 25 14:30:42 2016
+++ src/sys/net/route.c	Mon Apr 25 14:38:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.163 2016/04/25 14:30:42 ozaki-r Exp $	*/
+/*	$NetBSD: route.c,v 1.164 2016/04/25 14:38:08 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.163 2016/04/25 14:30:42 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.164 2016/04/25 14:38:08 ozaki-r Exp $");
 
 #include <sys/param.h>
 #ifdef RTFLUSH_DEBUG
@@ -549,10 +549,12 @@ rtredirect(const struct sockaddr *dst, c
 			 * Smash the current notion of the gateway to
 			 * this destination.  Should check about netmask!!!
 			 */
-			rt->rt_flags |= RTF_MODIFIED;
-			flags |= RTF_MODIFIED;
+			error = rt_setgate(rt, gateway);
+			if (error == 0) {
+				rt->rt_flags |= RTF_MODIFIED;
+				flags |= RTF_MODIFIED;
+			}
 			stat = &rtstat.rts_newgateway;
-			rt_setgate(rt, gateway);
 		}
 	} else
 		error = EHOSTUNREACH;
@@ -825,8 +827,12 @@ rtrequest1(int req, struct rt_addrinfo *
 		}
 
 		rt_set_ifa(rt, ifa);
-		if (info->rti_info[RTAX_TAG] != NULL)
-			rt_settag(rt, info->rti_info[RTAX_TAG]);
+		if (info->rti_info[RTAX_TAG] != NULL) {
+			const struct sockaddr *tag;
+			tag = rt_settag(rt, info->rti_info[RTAX_TAG]);
+			if (tag == NULL)
+				senderr(ENOBUFS);
+		}
 		RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
 		if (info->rti_info[RTAX_IFP] != NULL &&
 		    (ifa2 = ifa_ifwithnet(info->rti_info[RTAX_IFP])) != NULL &&

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.183 src/sys/net/rtsock.c:1.184
--- src/sys/net/rtsock.c:1.183	Mon Apr 25 10:55:01 2016
+++ src/sys/net/rtsock.c	Mon Apr 25 14:38:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.183 2016/04/25 10:55:01 ozaki-r Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.184 2016/04/25 14:38:08 ozaki-r Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.183 2016/04/25 10:55:01 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.184 2016/04/25 14:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -745,8 +745,12 @@ COMPATNAME(route_output)(struct mbuf *m,
 				if (error != 0)
 					senderr(error);
 			}
-			if (info.rti_info[RTAX_TAG])
-				rt_settag(rt, info.rti_info[RTAX_TAG]);
+			if (info.rti_info[RTAX_TAG]) {
+				const struct sockaddr *tag;
+				tag = rt_settag(rt, info.rti_info[RTAX_TAG]);
+				if (tag == NULL)
+					senderr(ENOBUFS);
+			}
 			/* new gateway could require new ifaddr, ifp;
 			   flags may also be different; ifp may be specified
 			   by ll sockaddr when protocol address is ambiguous */

Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.208 src/sys/netinet/if_arp.c:1.209
--- src/sys/netinet/if_arp.c:1.208	Tue Apr 19 04:13:56 2016
+++ src/sys/netinet/if_arp.c	Mon Apr 25 14:38:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.208 2016/04/19 04:13:56 ozaki-r Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.209 2016/04/25 14: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.208 2016/04/19 04:13:56 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.209 2016/04/25 14:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -506,6 +506,10 @@ arp_rtrequest(int req, struct rtentry *r
 		break;
 	case RTM_ADD:
 		gate = arp_setgate(rt, gate, info->rti_info[RTAX_NETMASK]);
+		if (gate == NULL) {
+			log(LOG_ERR, "%s: arp_setgate failed\n", __func__);
+			break;
+		}
 		if ((rt->rt_flags & RTF_CONNECTED) ||
 		    (rt->rt_flags & RTF_LOCAL)) {
 			/*

Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.191 src/sys/netinet6/nd6.c:1.192
--- src/sys/netinet6/nd6.c:1.191	Thu Apr 21 05:07:50 2016
+++ src/sys/netinet6/nd6.c	Mon Apr 25 14:38:08 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.191 2016/04/21 05:07:50 ozaki-r Exp $	*/
+/*	$NetBSD: nd6.c,v 1.192 2016/04/25 14:38:08 ozaki-r Exp $	*/
 /*	$KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.191 2016/04/21 05:07:50 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.192 2016/04/25 14:38:08 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -1389,6 +1389,12 @@ nd6_rtrequest(int req, struct rtentry *r
 			rt_setgate(rt, &u.sa);
 			gate = rt->rt_gateway;
 			RT_DPRINTF("rt_getkey(rt) = %p\n", rt_getkey(rt));
+			if (gate == NULL) {
+				log(LOG_ERR,
+				    "%s: rt_setgate failed on %s\n", __func__,
+				    if_name(ifp));
+				break;
+			}
 
 			RT_DPRINTF("rt_getkey(rt) = %p\n", rt_getkey(rt));
 			if ((rt->rt_flags & RTF_CONNECTED) != 0)

Reply via email to