summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2023-05-28 10:13:16 -0400
committerDonald Sharp <sharpd@nvidia.com>2023-05-28 10:13:16 -0400
commit46d725f76b4ae045f0930fe310dbbcf8d8280bb4 (patch)
tree1a6686e7e7d30c0f392f7bcdd498de9fa7191d52
parent06504bea79e9b054dffb56374cc42054180e24c1 (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.c1
-rw-r--r--zebra/interface.c3
2 files changed, 4 insertions, 0 deletions
diff --git a/lib/if.c b/lib/if.c
index 08d8918742..6f567861d1 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -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;