Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/netinet Fix panic on packet sending via a route with rt_...
details: https://anonhg.NetBSD.org/src/rev/7446a9c36496
branches: trunk
changeset: 372387:7446a9c36496
user: knakahara <knakahara%NetBSD.org@localhost>
date: Mon Nov 21 09:51:13 2022 +0000
description:
Fix panic on packet sending via a route with rt_ifa of AF_LINK.
A route with rt_ifa of AF_LINK can be set by some routing daemons when
it adds a route that has a gateway of AF_LINK. If there is no address on
a target interface, the kernel sets an AF_LINK address of the interface to
rt_ifa of the route. In that case, a variable of a local address in
ip_output (ia) can be NULL and we need more NULL-checks of it.
diffstat:
sys/netinet/ip_output.c | 22 ++++++++++++++++++++--
1 files changed, 20 insertions(+), 2 deletions(-)
diffs (50 lines):
diff -r 2f1bac607f4b -r 7446a9c36496 sys/netinet/ip_output.c
--- a/sys/netinet/ip_output.c Sun Nov 20 14:53:14 2022 +0000
+++ b/sys/netinet/ip_output.c Mon Nov 21 09:51:13 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_output.c,v 1.323 2022/11/04 09:00:58 ozaki-r Exp $ */
+/* $NetBSD: ip_output.c,v 1.324 2022/11/21 09:51:13 knakahara 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.323 2022/11/04 09:00:58 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.324 2022/11/21 09:51:13 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -531,6 +531,15 @@
if (in_nullhost(ip->ip_src)) {
struct ifaddr *xifa;
+ /* If rt_ifa is AF_LINK, ia can be NULL. */
+ if (ia == NULL) {
+ KASSERTMSG(rt->rt_ifa->ifa_addr->sa_family == AF_LINK,
+ "sa_family=%d", rt->rt_ifa->ifa_addr->sa_family);
+ IP_STATINC(IP_STAT_NOROUTE);
+ error = EHOSTUNREACH;
+ goto bad;
+ }
+
xifa = &ia->ia_ifa;
if (xifa->ifa_getifa != NULL) {
ia4_release(ia, &psref_ia);
@@ -582,6 +591,15 @@
sendit:
if ((flags & (IP_FORWARDING|IP_NOIPNEWID)) == 0) {
+ /* If rt_ifa is AF_LINK, ia can be NULL. */
+ if (ia == NULL) {
+ KASSERTMSG(rt->rt_ifa->ifa_addr->sa_family == AF_LINK,
+ "sa_family=%d", rt->rt_ifa->ifa_addr->sa_family);
+ IP_STATINC(IP_STAT_NOROUTE);
+ error = EHOSTUNREACH;
+ goto bad;
+ }
+
if (m->m_pkthdr.len < IP_MINFRAGSIZE) {
ip->ip_id = 0;
} else if ((m->m_pkthdr.csum_flags & M_CSUM_TSOv4) == 0) {
Home |
Main Index |
Thread Index |
Old Index