]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: zebra crash for zapi stream
authorSoumya Roy <souroy@nvidia.com>
Fri, 14 Mar 2025 21:56:48 +0000 (21:56 +0000)
committerSoumya Roy <souroy@nvidia.com>
Thu, 20 Mar 2025 16:13:44 +0000 (16:13 +0000)
Issue:
If static route is created with a BGP route as nexthop, which
recursively resolves over 512 ECMP v6 nexthops, zapi nexthop encode
fails, as there is not enough memory allocated for stream. This causes
assert/core dump in zebra. Right now we allocate fixed memory
of ZEBRA_MAX_PACKET_SIZ size.

Fix:
1)Dynamically calculate required memory size for the stream
2)try to optimize memory usage

Testing:
No crash happens anymore with the fix
zebra: zebra crash for zapi stream

Issue:
If static route is created with a BGP route as nexthop, which
recursively resolves over 512 ECMP v6 nexthops, zapi nexthop encode
fails, as there is not enough memory allocated for stream. This causes
assert/core dump in zebra. Right now we allocate fixed memory
of ZEBRA_MAX_PACKET_SIZ size.

Fix:
1)Dynamically calculate required memory size for the stream
2)try to optimize memory usage

Testing:
No crash happens anymore with the fix
r1#
r1# sharp install routes 2100:cafe:: nexthop 2001:db8::1 1000
r1#

r2# conf
r2(config)# ipv6 route 2503:feca::100/128 2100:cafe::1
r2(config)# exit
r2#

Signed-off-by: Soumya Roy <souroy@nvidia.com>
zebra/zebra_rnh.c

index 640e6551a774d437c95ab3eb6bf49a6b9c0c3150..6b6be59c475920d96abdffac2ceeaa0cf37594ca 100644 (file)
@@ -1150,7 +1150,7 @@ int zebra_send_rnh_update(struct rnh *rnh, struct zserv *client,
        re = rnh->state;
 
        /* Get output stream. */
-       s = stream_new(ZEBRA_MAX_PACKET_SIZ);
+       s = stream_new_expandable(ZEBRA_MAX_PACKET_SIZ);
 
        zclient_create_header(s, ZEBRA_NEXTHOP_UPDATE, vrf_id);