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)