aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2023-02-17 17:20:38 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2023-02-18 11:56:54 +0000
commit45ced2987df29a8587df2ad3c9ea0ddb1998aa16 (patch)
tree3d93fcef178f7986112cfb2f7905fa084e9eb4ce
parentc169fb625ee0800ad1e6046440d67eef598581c2 (diff)
downloadsrc-45ced2987df29a8587df2ad3c9ea0ddb1998aa16.tar.gz
src-45ced2987df29a8587df2ad3c9ea0ddb1998aa16.zip
routing: always pass rtentry to add_route_flags().
add_route_flags() uses `rt` prefix data to lookup the the current rtentry from the routing table. Update rib_add_route_px() to always pass rtentry regardless of the op_flags. Reported by: Stefan Grundmann <sg2342@googlemail.com> MFC after: 1 day (cherry picked from commit a0aa160b6d261f67b29a25c7cc5e04668fb6faf7)
-rw-r--r--sys/net/route/route_ctl.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c
index eaabe901b3cb..9bb02c99ddce 100644
--- a/sys/net/route/route_ctl.c
+++ b/sys/net/route/route_ctl.c
@@ -454,7 +454,7 @@ fill_pxmask_family(int family, int plen, struct sockaddr *_dst,
* Attempts to add @dst/plen prefix with nexthop/nexhopgroup data @rnd
* to the routing table.
*
- * @fibnum: rtable id to insert route to
+ * @fibnum: verified kernel rtable id to insert route to
* @dst: verified kernel-originated sockaddr, can be masked if plen non-empty
* @plen: prefix length (or -1 if host route or not applicable for AF)
* @op_flags: combination of RTM_F_ flags
@@ -489,6 +489,16 @@ rib_add_route_px(uint32_t fibnum, struct sockaddr *dst, int plen,
FIB_RH_LOG(LOG_INFO, rnh, "rtentry allocation failed");
return (ENOMEM);
}
+ } else {
+ struct route_nhop_data rnd_tmp;
+ RIB_RLOCK_TRACKER;
+
+ RIB_RLOCK(rnh);
+ rt = lookup_prefix_bysa(rnh, dst, netmask, &rnd_tmp);
+ RIB_RUNLOCK(rnh);
+
+ if (rt == NULL)
+ return (ESRCH);
}
return (add_route_flags(rnh, rt, rnd, op_flags, rc));
@@ -765,6 +775,8 @@ add_route_flags(struct rib_head *rnh, struct rtentry *rt, struct route_nhop_data
struct rtentry *rt_orig;
int error = 0;
+ MPASS(rt != NULL);
+
nh = rnd_add->rnd_nhop;
RIB_WLOCK(rnh);