diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2023-05-28 10:13:16 -0400 |
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2023-05-28 10:13:16 -0400 |
| commit | 46d725f76b4ae045f0930fe310dbbcf8d8280bb4 (patch) | |
| tree | 1a6686e7e7d30c0f392f7bcdd498de9fa7191d52 | |
| parent | 06504bea79e9b054dffb56374cc42054180e24c1 (diff) | |
lib, zebra: Ensure that the ifp->node exists
On removal, ensure that the ifp->node is set to a null
pointer so that FRR does not use data after freed.
In addition ensure that the ifp->node exists before
attempting to free it.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
| -rw-r--r-- | lib/if.c | 1 | ||||
| -rw-r--r-- | zebra/interface.c | 3 |
2 files changed, 4 insertions, 0 deletions
@@ -1028,6 +1028,7 @@ void if_terminate(struct vrf *vrf) if (ifp->node) { ifp->node->info = NULL; route_unlock_node(ifp->node); + ifp->node = NULL; } if_delete(&ifp); } diff --git a/zebra/interface.c b/zebra/interface.c index 231ddc51db..ccf1a0a204 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -267,6 +267,9 @@ struct interface *if_link_per_ns(struct zebra_ns *ns, struct interface *ifp) /* Delete a VRF. This is called in vrf_terminate(). */ void if_unlink_per_ns(struct interface *ifp) { + if (!ifp->node) + return; + ifp->node->info = NULL; route_unlock_node(ifp->node); ifp->node = NULL; |
