Module Name:    src
Committed By:   ozaki-r
Date:           Mon Apr 27 10:14:44 UTC 2015

Modified Files:
        src/sys/netinet: ip_output.c
        src/sys/netinet6: in6_pcb.c ip6_output.c nd6_nbr.c

Log Message:
Add missing error checks on rtcache_setdst

It can fail with ENOMEM.


To generate a diff of this commit:
cvs rdiff -u -r1.237 -r1.238 src/sys/netinet/ip_output.c
cvs rdiff -u -r1.138 -r1.139 src/sys/netinet6/in6_pcb.c
cvs rdiff -u -r1.164 -r1.165 src/sys/netinet6/ip6_output.c
cvs rdiff -u -r1.107 -r1.108 src/sys/netinet6/nd6_nbr.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/ip_output.c
diff -u src/sys/netinet/ip_output.c:1.237 src/sys/netinet/ip_output.c:1.238
--- src/sys/netinet/ip_output.c:1.237	Fri Apr 24 00:48:47 2015
+++ src/sys/netinet/ip_output.c	Mon Apr 27 10:14:44 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_output.c,v 1.237 2015/04/24 00:48:47 ozaki-r Exp $	*/
+/*	$NetBSD: ip_output.c,v 1.238 2015/04/27 10:14:44 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_output.c,v 1.237 2015/04/24 00:48:47 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.238 2015/04/27 10:14:44 ozaki-r Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -246,7 +246,9 @@ ip_output(struct mbuf *m0, ...)
 	if ((rt = rtcache_validate(ro)) == NULL &&
 	    (rt = rtcache_update(ro, 1)) == NULL) {
 		dst = &u.dst4;
-		rtcache_setdst(ro, &u.dst);
+		error = rtcache_setdst(ro, &u.dst);
+		if (error != 0)
+			goto bad;
 	}
 
 	/*
@@ -1416,7 +1418,9 @@ ip_get_membership(const struct sockopt *
 		memset(&ro, 0, sizeof(ro));
 
 		sockaddr_in_init(&u.dst4, ia, 0);
-		rtcache_setdst(&ro, &u.dst);
+		error = rtcache_setdst(&ro, &u.dst);
+		if (error != 0)
+			return error;
 		*ifp = (rt = rtcache_init(&ro)) != NULL ? rt->rt_ifp : NULL;
 		rtcache_free(&ro);
 	} else {

Index: src/sys/netinet6/in6_pcb.c
diff -u src/sys/netinet6/in6_pcb.c:1.138 src/sys/netinet6/in6_pcb.c:1.139
--- src/sys/netinet6/in6_pcb.c:1.138	Mon Apr 27 02:59:44 2015
+++ src/sys/netinet6/in6_pcb.c	Mon Apr 27 10:14:44 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.c,v 1.138 2015/04/27 02:59:44 ozaki-r Exp $	*/
+/*	$NetBSD: in6_pcb.c,v 1.139 2015/04/27 10:14:44 ozaki-r Exp $	*/
 /*	$KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.138 2015/04/27 02:59:44 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.139 2015/04/27 10:14:44 ozaki-r Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -1100,7 +1100,8 @@ in6_pcbrtentry(struct in6pcb *in6p)
 		addr.s_addr = in6p->in6p_faddr.s6_addr32[3];
 
 		sockaddr_in_init(&u.dst4, &addr, 0);
-		rtcache_setdst(ro, &u.dst);
+		if (rtcache_setdst(ro, &u.dst) != 0)
+			return NULL;
 
 		rt = rtcache_init(ro);
 	} else
@@ -1112,7 +1113,8 @@ in6_pcbrtentry(struct in6pcb *in6p)
 		} u;
 
 		sockaddr_in6_init(&u.dst6, &in6p->in6p_faddr, 0, 0, 0);
-		rtcache_setdst(ro, &u.dst);
+		if (rtcache_setdst(ro, &u.dst) != 0)
+			return NULL;
 
 		rt = rtcache_init(ro);
 	}

Index: src/sys/netinet6/ip6_output.c
diff -u src/sys/netinet6/ip6_output.c:1.164 src/sys/netinet6/ip6_output.c:1.165
--- src/sys/netinet6/ip6_output.c:1.164	Fri Apr 24 08:53:06 2015
+++ src/sys/netinet6/ip6_output.c	Mon Apr 27 10:14:44 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_output.c,v 1.164 2015/04/24 08:53:06 ozaki-r Exp $	*/
+/*	$NetBSD: ip6_output.c,v 1.165 2015/04/27 10:14:44 ozaki-r 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.164 2015/04/24 08:53:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.165 2015/04/27 10:14:44 ozaki-r Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet6.h"
@@ -2333,7 +2333,9 @@ ip6_get_membership(const struct sockopt 
 			sockaddr_in_init(&u.dst4, ia4, 0);
 		else
 			sockaddr_in6_init(&u.dst6, ia, 0, 0, 0);
-		rtcache_setdst(&ro, &u.dst);
+		error = rtcache_setdst(&ro, &u.dst);
+		if (error != 0)
+			return error;
 		*ifp = (rt = rtcache_init(&ro)) != NULL ? rt->rt_ifp : NULL;
 		rtcache_free(&ro);
 	} else {

Index: src/sys/netinet6/nd6_nbr.c
diff -u src/sys/netinet6/nd6_nbr.c:1.107 src/sys/netinet6/nd6_nbr.c:1.108
--- src/sys/netinet6/nd6_nbr.c:1.107	Mon Mar 30 04:25:26 2015
+++ src/sys/netinet6/nd6_nbr.c	Mon Apr 27 10:14:44 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_nbr.c,v 1.107 2015/03/30 04:25:26 ozaki-r Exp $	*/
+/*	$NetBSD: nd6_nbr.c,v 1.108 2015/04/27 10:14:44 ozaki-r Exp $	*/
 /*	$KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.107 2015/03/30 04:25:26 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.108 2015/04/27 10:14:44 ozaki-r Exp $");
 
 #include "opt_inet.h"
 
@@ -927,7 +927,8 @@ nd6_na_output(
 	ip6->ip6_dst = daddr6;
 	sockaddr_in6_init(&u.dst6, &daddr6, 0, 0, 0);
 	dst = &u.dst;
-	rtcache_setdst(&ro, dst);
+	if (rtcache_setdst(&ro, dst) != 0)
+		goto bad;
 
 	/*
 	 * Select a source whose scope is the same as that of the dest.

Reply via email to