From ec81f538be8c851a422109dc19079d482df3d7f3 Mon Sep 17 00:00:00 2001 From: wayneonway <121931005@qq.com> Date: Wed, 6 Apr 2022 14:54:01 +0800 Subject: [PATCH] netlink: route handling checks for SRC when it means DST https://github.com/warmcat/libwebsockets/issues/2603 --- lib/core-net/private-lib-core-net.h | 1 + lib/core-net/route.c | 2 +- lib/roles/netlink/ops-netlink.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/core-net/private-lib-core-net.h b/lib/core-net/private-lib-core-net.h index c515c10d5..4fb99cdf7 100644 --- a/lib/core-net/private-lib-core-net.h +++ b/lib/core-net/private-lib-core-net.h @@ -1375,6 +1375,7 @@ _lws_routing_table_dump(struct lws_context *cx); #define LRR_IGNORE_PRI (1 << 0) #define LRR_MATCH_SRC (1 << 1) +#define LRR_MATCH_DST (1 << 2) lws_route_t * _lws_route_remove(struct lws_context_per_thread *pt, lws_route_t *robj, int flags); diff --git a/lib/core-net/route.c b/lib/core-net/route.c index 14f4beb07..c9fdc2ba2 100644 --- a/lib/core-net/route.c +++ b/lib/core-net/route.c @@ -146,7 +146,7 @@ _lws_route_remove(struct lws_context_per_thread *pt, lws_route_t *robj, int flag lws_route_t *rou = lws_container_of(d, lws_route_t, list); if ((!(flags & LRR_MATCH_SRC) || !lws_sa46_compare_ads(&robj->src, &rou->src)) && - ((flags & LRR_MATCH_SRC) || !lws_sa46_compare_ads(&robj->dest, &rou->dest)) && + (!(flags & LRR_MATCH_DST) || !lws_sa46_compare_ads(&robj->dest, &rou->dest)) && (!robj->gateway.sa4.sin_family || !lws_sa46_compare_ads(&robj->gateway, &rou->gateway)) && robj->dest_len <= rou->dest_len && diff --git a/lib/roles/netlink/ops-netlink.c b/lib/roles/netlink/ops-netlink.c index 846a97433..fa3bf29a2 100644 --- a/lib/roles/netlink/ops-netlink.c +++ b/lib/roles/netlink/ops-netlink.c @@ -371,8 +371,8 @@ ana: lws_pt_lock(pt, __func__); /* returns zero on match already in table */ - rmat = _lws_route_remove(pt, &robj, LRR_MATCH_SRC | - LRR_IGNORE_PRI); + rmat = _lws_route_remove(pt, &robj, h->nlmsg_type == RTM_NEWROUTE ? + LRR_MATCH_DST : LRR_MATCH_SRC | LRR_IGNORE_PRI); lws_pt_unlock(pt); if (rmat) {