diff --git a/src/sonic-frr/patch/0037-bgp-community-memory-leak-fix.patch b/src/sonic-frr/patch/0037-bgp-community-memory-leak-fix.patch index cf3a27f50ec..8d1ff02d46b 100644 --- a/src/sonic-frr/patch/0037-bgp-community-memory-leak-fix.patch +++ b/src/sonic-frr/patch/0037-bgp-community-memory-leak-fix.patch @@ -1,200 +1,7 @@ -From 139e450bccf3c2591c7b158662b36e5b9ff33172 Mon Sep 17 00:00:00 2001 +From 2b8e4e4b93a78e5884e2e5b97050b4ea3843e2e0 Mon Sep 17 00:00:00 2001 From: Donald Sharp -Date: Sat, 2 Mar 2024 09:42:30 -0500 -Subject: [PATCH 1/5] bgpd: Include unsuppress-map as a valid outgoing policy - -If unsuppress-map is setup for outgoing peers, consider that -policy is being applied as for RFC 8212. - -Signed-off-by: Donald Sharp ---- - bgpd/bgp_route.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index f4dff0d802..3a03644f93 100644 ---- a/bgpd/bgp_route.c -+++ b/bgpd/bgp_route.c -@@ -5834,10 +5834,10 @@ bool bgp_outbound_policy_exists(struct peer *peer, struct bgp_filter *filter) - if (peer->sort == BGP_PEER_IBGP) - return true; - -- if (peer->sort == BGP_PEER_EBGP -- && (ROUTE_MAP_OUT_NAME(filter) || PREFIX_LIST_OUT_NAME(filter) -- || FILTER_LIST_OUT_NAME(filter) -- || DISTRIBUTE_OUT_NAME(filter))) -+ if (peer->sort == BGP_PEER_EBGP && -+ (ROUTE_MAP_OUT_NAME(filter) || PREFIX_LIST_OUT_NAME(filter) || -+ FILTER_LIST_OUT_NAME(filter) || DISTRIBUTE_OUT_NAME(filter) || -+ UNSUPPRESS_MAP_NAME(filter))) - return true; - return false; - } --- -2.14.1 - - -From 2e09994360cda6251fd95845feb878f83e4f9345 Mon Sep 17 00:00:00 2001 -From: Donatas Abraitis -Date: Fri, 3 Mar 2023 17:33:51 +0200 -Subject: [PATCH 2/5] bgpd: Intern attributes before putting into rib-out - -``` -==21860==ERROR: LeakSanitizer: detected memory leaks - -Direct leak of 80 byte(s) in 2 object(s) allocated from: - 0 0x7f8065294d28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28) - 1 0x7f8064cfd216 in qcalloc lib/memory.c:105 - 2 0x5646b7024073 in ecommunity_dup bgpd/bgp_ecommunity.c:252 - 3 0x5646b7153585 in route_set_ecommunity_lb bgpd/bgp_routemap.c:2925 - 4 0x7f8064d459be in route_map_apply_ext lib/routemap.c:2675 - 5 0x5646b7116584 in subgroup_announce_check bgpd/bgp_route.c:2374 - 6 0x5646b711b907 in subgroup_process_announce_selected bgpd/bgp_route.c:2918 - 7 0x5646b717ceb8 in group_announce_route_walkcb bgpd/bgp_updgrp_adv.c:184 - 8 0x7f8064cc6acd in hash_walk lib/hash.c:270 - 9 0x5646b717ae0c in update_group_af_walk bgpd/bgp_updgrp.c:2046 - 10 0x5646b7181275 in group_announce_route bgpd/bgp_updgrp_adv.c:1030 - 11 0x5646b711a986 in bgp_process_main_one bgpd/bgp_route.c:3303 - 12 0x5646b711b5bf in bgp_process_wq bgpd/bgp_route.c:3444 - 13 0x7f8064da12d7 in work_queue_run lib/workqueue.c:267 - 14 0x7f8064d891fb in thread_call lib/thread.c:1991 - 15 0x7f8064cdffcf in frr_run lib/libfrr.c:1185 - 16 0x5646b6feca67 in main bgpd/bgp_main.c:505 - 17 0x7f8063f96c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86) - -Indirect leak of 16 byte(s) in 2 object(s) allocated from: - 0 0x7f8065294b40 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb40) - 1 0x7f8064cfcf01 in qmalloc lib/memory.c:100 - 2 0x5646b7024151 in ecommunity_dup bgpd/bgp_ecommunity.c:256 - 3 0x5646b7153585 in route_set_ecommunity_lb bgpd/bgp_routemap.c:2925 - 4 0x7f8064d459be in route_map_apply_ext lib/routemap.c:2675 - 5 0x5646b7116584 in subgroup_announce_check bgpd/bgp_route.c:2374 - 6 0x5646b711b907 in subgroup_process_announce_selected bgpd/bgp_route.c:2918 - 7 0x5646b717ceb8 in group_announce_route_walkcb bgpd/bgp_updgrp_adv.c:184 - 8 0x7f8064cc6acd in hash_walk lib/hash.c:270 - 9 0x5646b717ae0c in update_group_af_walk bgpd/bgp_updgrp.c:2046 - 10 0x5646b7181275 in group_announce_route bgpd/bgp_updgrp_adv.c:1030 - 11 0x5646b711a986 in bgp_process_main_one bgpd/bgp_route.c:3303 - 12 0x5646b711b5bf in bgp_process_wq bgpd/bgp_route.c:3444 - 13 0x7f8064da12d7 in work_queue_run lib/workqueue.c:267 - 14 0x7f8064d891fb in thread_call lib/thread.c:1991 - 15 0x7f8064cdffcf in frr_run lib/libfrr.c:1185 - 16 0x5646b6feca67 in main bgpd/bgp_main.c:505 - 17 0x7f8063f96c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86) -``` - -Signed-off-by: Donatas Abraitis ---- - bgpd/bgp_route.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index 3a03644f93..1a7c0cc78e 100644 ---- a/bgpd/bgp_route.c -+++ b/bgpd/bgp_route.c -@@ -2917,10 +2917,14 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, - * in FIB, then it is advertised - */ - if (advertise) { -- if (!bgp_check_withdrawal(bgp, dest)) -- bgp_adj_out_set_subgroup( -- dest, subgrp, &attr, selected); -- else -+ if (!bgp_check_withdrawal(bgp, dest)) { -+ struct attr *adv_attr = -+ bgp_attr_intern(&attr); -+ -+ bgp_adj_out_set_subgroup(dest, subgrp, -+ adv_attr, -+ selected); -+ } else - bgp_adj_out_unset_subgroup( - dest, subgrp, 1, addpath_tx_id); - } --- -2.14.1 - - -From 0b4e9c386c7d1caa83d9790d90652a794f69e91e Mon Sep 17 00:00:00 2001 -From: Donatas Abraitis -Date: Mon, 27 Feb 2023 23:40:32 +0200 -Subject: [PATCH 3/5] bgpd: Intern attributes before putting into rib-out - -After we call subgroup_announce_check(), we leave communities, large-communities -that are modified by route-maps uninterned, and here we have a memory leak. - -``` -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323:Direct leak of 80 byte(s) in 2 object(s) allocated from: -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #0 0x7f0858d90037 in __interceptor_calloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:154 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #1 0x7f08589b15b2 in qcalloc lib/memory.c:105 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #2 0x561f5c4e08d2 in lcommunity_new bgpd/bgp_lcommunity.c:28 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #3 0x561f5c4e11d9 in lcommunity_dup bgpd/bgp_lcommunity.c:141 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #4 0x561f5c5c3b8b in route_set_lcommunity bgpd/bgp_routemap.c:2491 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #5 0x7f0858a177a5 in route_map_apply_ext lib/routemap.c:2675 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #6 0x561f5c5696f9 in subgroup_announce_check bgpd/bgp_route.c:2352 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #7 0x561f5c5fb728 in subgroup_announce_table bgpd/bgp_updgrp_adv.c:682 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #8 0x561f5c5fbd95 in subgroup_announce_route bgpd/bgp_updgrp_adv.c:765 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #9 0x561f5c5f6105 in peer_af_announce_route bgpd/bgp_updgrp.c:2187 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #10 0x561f5c5790be in bgp_announce_route_timer_expired bgpd/bgp_route.c:5032 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #11 0x7f0858a76e4e in thread_call lib/thread.c:1991 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #12 0x7f0858974c24 in frr_run lib/libfrr.c:1185 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #13 0x561f5c3e955d in main bgpd/bgp_main.c:505 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #14 0x7f08583a9d09 in __libc_start_main ../csu/libc-start.c:308 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323:Indirect leak of 144 byte(s) in 2 object(s) allocated from: -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #0 0x7f0858d8fe8f in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #1 0x7f08589b1579 in qmalloc lib/memory.c:100 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #2 0x561f5c4e1282 in lcommunity_dup bgpd/bgp_lcommunity.c:144 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #3 0x561f5c5c3b8b in route_set_lcommunity bgpd/bgp_routemap.c:2491 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #4 0x7f0858a177a5 in route_map_apply_ext lib/routemap.c:2675 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #5 0x561f5c5696f9 in subgroup_announce_check bgpd/bgp_route.c:2352 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #6 0x561f5c5fb728 in subgroup_announce_table bgpd/bgp_updgrp_adv.c:682 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #7 0x561f5c5fbd95 in subgroup_announce_route bgpd/bgp_updgrp_adv.c:765 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #8 0x561f5c5f6105 in peer_af_announce_route bgpd/bgp_updgrp.c:2187 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #9 0x561f5c5790be in bgp_announce_route_timer_expired bgpd/bgp_route.c:5032 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #10 0x7f0858a76e4e in thread_call lib/thread.c:1991 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #11 0x7f0858974c24 in frr_run lib/libfrr.c:1185 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #12 0x561f5c3e955d in main bgpd/bgp_main.c:505 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- #13 0x7f08583a9d09 in __libc_start_main ../csu/libc-start.c:308 -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323- -./bgp_large_community.test_bgp_large_community_topo_2/r1.bgpd.asan.2465323-SUMMARY: AddressSanitizer: 224 byte(s) leaked in 4 allocation(s). -``` - -Signed-off-by: Donatas Abraitis ---- - bgpd/bgp_updgrp_adv.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c -index af8ef751da..de2b3206b7 100644 ---- a/bgpd/bgp_updgrp_adv.c -+++ b/bgpd/bgp_updgrp_adv.c -@@ -715,11 +715,14 @@ void subgroup_announce_table(struct update_subgroup *subgrp, - &attr, NULL)) { - /* Check if route can be advertised */ - if (advertise) { -- if (!bgp_check_withdrawal(bgp, dest)) -+ if (!bgp_check_withdrawal(bgp, dest)) { -+ struct attr *adv_attr = -+ bgp_attr_intern(&attr); -+ - bgp_adj_out_set_subgroup( -- dest, subgrp, &attr, -+ dest, subgrp, adv_attr, - ri); -- else -+ } else - bgp_adj_out_unset_subgroup( - dest, subgrp, 1, - bgp_addpath_id_for_peer( --- -2.14.1 - - -From 4b6279f6779ff6f6041bd08b242f86a1098d6e6d Mon Sep 17 00:00:00 2001 -From: Donald Sharp -Date: Sat, 2 Mar 2024 09:50:38 -0500 -Subject: [PATCH 4/5] bgpd: Ensure community data is freed in some cases. +Date: Thu, 7 Mar 2024 22:18:18 -0500 +Subject: [PATCH 1/2] bgpd: Combined patch to clean up filter leaks Customer has this valgrind trace: @@ -247,10 +54,10 @@ Fixes: #15459 Signed-off-by: Donald Sharp --- bgpd/bgp_conditional_adv.c | 5 +++-- - bgpd/bgp_route.c | 19 +++++++++++++------ + bgpd/bgp_route.c | 19 +++++++++++------ bgpd/bgp_updgrp.h | 2 +- - bgpd/bgp_updgrp_adv.c | 29 ++++++++++++++++++----------- - 4 files changed, 35 insertions(+), 20 deletions(-) + bgpd/bgp_updgrp_adv.c | 53 ++++++++++++++++++++++++++-------------------- + 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/bgpd/bgp_conditional_adv.c b/bgpd/bgp_conditional_adv.c index 4ad00ed121..89ea85ff46 100644 @@ -269,22 +76,22 @@ index 4ad00ed121..89ea85ff46 100644 /* If default originate is enabled for * the peer, do not send explicit diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index 1a7c0cc78e..53eec67e41 100644 +index a7a5c9849a..157bfa8a2b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c -@@ -2921,16 +2921,23 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, - struct attr *adv_attr = - bgp_attr_intern(&attr); - -- bgp_adj_out_set_subgroup(dest, subgrp, -- adv_attr, -- selected); -- } else -+ if (!bgp_adj_out_set_subgroup(dest, -+ subgrp, -+ adv_attr, -+ selected)) -+ bgp_attr_unintern(&adv_attr); +@@ -2917,16 +2917,23 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, + * in FIB, then it is advertised + */ + if (advertise) { +- if (!bgp_check_withdrawal(bgp, dest)) +- bgp_adj_out_set_subgroup( +- dest, subgrp, &attr, selected); +- else ++ if (!bgp_check_withdrawal(bgp, dest)) { ++ if (!bgp_adj_out_set_subgroup( ++ dest, subgrp, &attr, ++ selected)) ++ bgp_attr_flush(&attr); + } else { bgp_adj_out_unset_subgroup( dest, subgrp, 1, addpath_tx_id); @@ -316,7 +123,7 @@ index e27c1e7b67..b7b6aa07e9 100644 struct attr *attr, struct bgp_path_info *path); diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c -index de2b3206b7..1ca79f818a 100644 +index af8ef751da..301a8b267e 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c @@ -454,7 +454,7 @@ bgp_advertise_clean_subgroup(struct update_subgroup *subgrp, @@ -364,44 +171,74 @@ index de2b3206b7..1ca79f818a 100644 } /* The only time 'withdraw' will be false is if we are sending -@@ -719,9 +721,10 @@ void subgroup_announce_table(struct update_subgroup *subgrp, - struct attr *adv_attr = - bgp_attr_intern(&attr); - +@@ -668,7 +670,7 @@ void subgroup_announce_table(struct update_subgroup *subgrp, + { + struct bgp_dest *dest; + struct bgp_path_info *ri; +- struct attr attr; ++ struct attr attr = {0}; + struct peer *peer; + afi_t afi; + safi_t safi; +@@ -715,19 +717,24 @@ void subgroup_announce_table(struct update_subgroup *subgrp, + &attr, NULL)) { + /* Check if route can be advertised */ + if (advertise) { +- if (!bgp_check_withdrawal(bgp, dest)) - bgp_adj_out_set_subgroup( -+ if (!bgp_adj_out_set_subgroup( - dest, subgrp, adv_attr, +- dest, subgrp, &attr, - ri); -+ ri)) -+ bgp_attr_unintern(&adv_attr); - } else +- else ++ if (!bgp_check_withdrawal(bgp, dest)) { ++ if (!bgp_adj_out_set_subgroup( ++ dest, subgrp, &attr, ++ ri)) ++ bgp_attr_flush(&attr); ++ } else { ++ bgp_attr_flush(&attr); bgp_adj_out_unset_subgroup( dest, subgrp, 1, -@@ -950,7 +953,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) + bgp_addpath_id_for_peer( + peer, afi, + safi_rib, + &ri->tx_addpath)); +- } ++ } ++ } else ++ bgp_attr_flush(&attr); + } else { ++ bgp_attr_flush(&attr); + /* If default originate is enabled for + * the peer, do not send explicit + * withdraw. This will prevent deletion +@@ -947,18 +954,18 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) if (dest) { for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) { - if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) -+ if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) { - if (subgroup_announce_check( - dest, pi, subgrp, - bgp_dest_get_prefix(dest), -@@ -958,10 +961,14 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) - struct attr *default_attr = - bgp_attr_intern(&attr); - +- if (subgroup_announce_check( +- dest, pi, subgrp, +- bgp_dest_get_prefix(dest), +- &attr, NULL)) { +- struct attr *default_attr = +- bgp_attr_intern(&attr); +- - bgp_adj_out_set_subgroup( - dest, subgrp, - default_attr, pi); - } -+ if (!bgp_adj_out_set_subgroup( -+ dest, subgrp, -+ default_attr, pi)) -+ bgp_attr_unintern( -+ &default_attr); -+ } else ++ if (!CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) ++ continue; ++ ++ if (subgroup_announce_check( ++ dest, pi, subgrp, ++ bgp_dest_get_prefix(dest), &attr, ++ NULL)) { ++ if (!bgp_adj_out_set_subgroup( ++ dest, subgrp, &attr, pi)) + bgp_attr_flush(&attr); -+ } ++ } else ++ bgp_attr_flush(&attr); } bgp_dest_unlock_node(dest); } @@ -409,63 +246,58 @@ index de2b3206b7..1ca79f818a 100644 2.14.1 -From 99a172180972145556887595a1ca75e82f71c244 Mon Sep 17 00:00:00 2001 +From 761907075520aa3fae70a8d18fa717a24d3cbd65 Mon Sep 17 00:00:00 2001 From: Donald Sharp -Date: Mon, 4 Mar 2024 09:51:42 -0500 -Subject: [PATCH 5/5] bgpd: Cleanup indenting for subgroup_default_originate - -Part of the subgroup_default_originate function was indented -very deeply. Clean this up some. +Date: Wed, 13 Mar 2024 10:26:58 -0400 +Subject: [PATCH 2/2] bgpd: Ensure that the correct aspath is free'd + +Currently in subgroup_default_originate the attr.aspath +is set in bgp_attr_default_set, which hashs the aspath +and creates a refcount for it. If this is a withdraw +the subgroup_announce_check and bgp_adj_out_set_subgroup +is called which will intern the attribute. This will +cause the the attr.aspath to be set to a new value +finally at the bottom of the function it intentionally +uninterns the aspath which is not the one that was +created for this function. This reduces the other +aspath's refcount by 1 and if a clear bgp * is issued +fast enough the aspath for that will be removed +and the system will crash. Signed-off-by: Donald Sharp --- - bgpd/bgp_updgrp_adv.c | 33 +++++++++++++++++---------------- - 1 file changed, 17 insertions(+), 16 deletions(-) + bgpd/bgp_updgrp_adv.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c -index 1ca79f818a..364454e06c 100644 +index 301a8b267e..75e377f9a1 100644 --- a/bgpd/bgp_updgrp_adv.c +++ b/bgpd/bgp_updgrp_adv.c -@@ -953,22 +953,23 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) - if (dest) { - for (pi = bgp_dest_get_bgp_path_info(dest); pi; - pi = pi->next) { -- if (CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) { -- if (subgroup_announce_check( -- dest, pi, subgrp, -- bgp_dest_get_prefix(dest), -- &attr, NULL)) { -- struct attr *default_attr = -- bgp_attr_intern(&attr); -- -- if (!bgp_adj_out_set_subgroup( -- dest, subgrp, -- default_attr, pi)) -- bgp_attr_unintern( -- &default_attr); -- } else -- bgp_attr_flush(&attr); -- } -+ if (!CHECK_FLAG(pi->flags, BGP_PATH_SELECTED)) -+ continue; -+ -+ if (subgroup_announce_check( -+ dest, pi, subgrp, -+ bgp_dest_get_prefix(dest), &attr, -+ NULL)) { -+ struct attr *default_attr = -+ bgp_attr_intern(&attr); -+ -+ if (!bgp_adj_out_set_subgroup( -+ dest, subgrp, default_attr, -+ pi)) -+ bgp_attr_unintern( -+ &default_attr); -+ } else -+ bgp_attr_flush(&attr); - } - bgp_dest_unlock_node(dest); +@@ -817,6 +817,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) + struct bgp *bgp; + struct attr attr; + struct attr *new_attr = &attr; ++ struct aspath *aspath; + struct prefix p; + struct peer *from; + struct bgp_dest *dest; +@@ -854,6 +855,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) + /* make coverity happy */ + assert(attr.aspath); + ++ aspath = attr.aspath; + attr.med = 0; + attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC); + +@@ -1009,7 +1011,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) } + } + +- aspath_unintern(&attr.aspath); ++ aspath_unintern(&aspath); + } + + /* -- 2.14.1 diff --git a/src/sonic-frr/patch/0038-bgp-community-memory-leak-update.patch b/src/sonic-frr/patch/0038-bgp-community-memory-leak-update.patch deleted file mode 100644 index dc9f5af5e42..00000000000 --- a/src/sonic-frr/patch/0038-bgp-community-memory-leak-update.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 223ac7ed19e0b73b38c551797c42eb3892d1503d Mon Sep 17 00:00:00 2001 -From: xuliping -Date: Fri, 8 Mar 2024 05:57:17 +0000 -Subject: [PATCH] update patch - ---- - bgpd/bgp_route.c | 6 +++--- - bgpd/bgp_updgrp_adv.c | 23 ++++++++++++++--------- - 2 files changed, 17 insertions(+), 12 deletions(-) - -diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index 55db3fc7a..f7219ce94 100644 ---- a/bgpd/bgp_route.c -+++ b/bgpd/bgp_route.c -@@ -2921,11 +2921,11 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp, - struct attr *adv_attr = - bgp_attr_intern(&attr); - -- if (!bgp_adj_out_set_subgroup(dest, -+ bgp_adj_out_set_subgroup(dest, - subgrp, - adv_attr, -- selected)) -- bgp_attr_unintern(&adv_attr); -+ selected); -+ bgp_attr_unintern(&adv_attr); - } else { - bgp_adj_out_unset_subgroup( - dest, subgrp, 1, addpath_tx_id); -diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c -index 364454e06..cc62548f6 100644 ---- a/bgpd/bgp_updgrp_adv.c -+++ b/bgpd/bgp_updgrp_adv.c -@@ -670,7 +670,7 @@ void subgroup_announce_table(struct update_subgroup *subgrp, - { - struct bgp_dest *dest; - struct bgp_path_info *ri; -- struct attr attr; -+ struct attr attr = {0}; - struct peer *peer; - afi_t afi; - safi_t safi; -@@ -721,19 +721,24 @@ void subgroup_announce_table(struct update_subgroup *subgrp, - struct attr *adv_attr = - bgp_attr_intern(&attr); - -- if (!bgp_adj_out_set_subgroup( -+ bgp_adj_out_set_subgroup( - dest, subgrp, adv_attr, -- ri)) -- bgp_attr_unintern(&adv_attr); -- } else -+ ri); -+ bgp_attr_unintern(&adv_attr); -+ } else { - bgp_adj_out_unset_subgroup( - dest, subgrp, 1, - bgp_addpath_id_for_peer( - peer, afi, - safi_rib, - &ri->tx_addpath)); -+ bgp_attr_flush(&attr); -+ } -+ } else { -+ bgp_attr_flush(&attr); - } - } else { -+ bgp_attr_flush(&attr); - /* If default originate is enabled for - * the peer, do not send explicit - * withdraw. This will prevent deletion -@@ -963,11 +968,11 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw) - struct attr *default_attr = - bgp_attr_intern(&attr); - -- if (!bgp_adj_out_set_subgroup( -+ bgp_adj_out_set_subgroup( - dest, subgrp, default_attr, -- pi)) -- bgp_attr_unintern( -- &default_attr); -+ pi); -+ bgp_attr_unintern( -+ &default_attr); - } else - bgp_attr_flush(&attr); - } --- -2.25.1 - diff --git a/src/sonic-frr/patch/series b/src/sonic-frr/patch/series index 641461232ea..fcc15bac8ff 100644 --- a/src/sonic-frr/patch/series +++ b/src/sonic-frr/patch/series @@ -34,4 +34,3 @@ cross-compile-changes.patch 0035-fpm-ignore-route-from-default-table.patch 0036-Add-support-of-bgp-l3vni-evpn.patch 0037-bgp-community-memory-leak-fix.patch -0038-bgp-community-memory-leak-update.patch