From fd1aa866eb22bcaa01dbedfbe7778c29c0c2fa25 Mon Sep 17 00:00:00 2001 From: "Alexander V. Chernikov" Date: Tue, 25 Apr 2023 10:53:51 +0000 Subject: [PATCH] routing: add rt_tables_get_rnh_safe() that doesn't panic when af/fib is incorrect. MFC after: 2 weeks --- sys/net/route/route_ctl.h | 2 ++ sys/net/route/route_tables.c | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/sys/net/route/route_ctl.h b/sys/net/route/route_ctl.h index 7a4ed804feb..d3c457cdeaa 100644 --- a/sys/net/route/route_ctl.h +++ b/sys/net/route/route_ctl.h @@ -35,6 +35,8 @@ #ifndef _NET_ROUTE_ROUTE_CTL_H_ #define _NET_ROUTE_ROUTE_CTL_H_ +struct rib_head *rt_tables_get_rnh_safe(uint32_t table, sa_family_t family); + struct rib_cmd_info { uint8_t rc_cmd; /* RTM_ADD|RTM_DEL|RTM_CHANGE */ uint8_t spare[3]; diff --git a/sys/net/route/route_tables.c b/sys/net/route/route_tables.c index be67556915d..31696e84748 100644 --- a/sys/net/route/route_tables.c +++ b/sys/net/route/route_tables.c @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include /* Kernel config default option. */ @@ -387,6 +388,16 @@ rt_tables_get_rnh(uint32_t table, sa_family_t family) return (rt_tables_get_rnh_ptr(table, family)); } +struct rib_head * +rt_tables_get_rnh_safe(uint32_t table, sa_family_t family) +{ + if (__predict_false(table >= V_rt_numfibs)) + return (NULL); + if (__predict_false(family >= (AF_MAX + 1))) + return (NULL); + return (rt_tables_get_rnh_ptr(table, family)); +} + u_int rt_tables_get_gen(uint32_t table, sa_family_t family) {