summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Stapp <mjs.ietf@gmail.com>2024-11-22 15:41:32 -0500
committerGitHub <noreply@github.com>2024-11-22 15:41:32 -0500
commitc84fd512ca9f882b13889f16f8affaef58f08071 (patch)
tree9ee9dc64077ba39282816e058e65f9710a8fa3e1
parent909d8546e1b552943b4f36191ca4e3bd09e26363 (diff)
parentcb6f7b153e6d76aea1636d7a63bce418195ecf35 (diff)
Merge pull request #17492 from donaldsharp/zebra_nh_label_crash
lib, zebra: Do not have duplicate memory type problems
-rw-r--r--lib/nexthop.c26
-rw-r--r--lib/nexthop.h2
-rw-r--r--zebra/zebra_mpls.c27
3 files changed, 29 insertions, 26 deletions
diff --git a/lib/nexthop.c b/lib/nexthop.c
index 98b05295b9..332581fbd8 100644
--- a/lib/nexthop.c
+++ b/lib/nexthop.c
@@ -581,6 +581,32 @@ void nexthop_del_labels(struct nexthop *nexthop)
nexthop->nh_label_type = ZEBRA_LSP_NONE;
}
+void nexthop_change_labels(struct nexthop *nexthop, struct mpls_label_stack *new_stack)
+{
+ struct mpls_label_stack *nh_label_tmp;
+ uint32_t i;
+
+ /* Enforce limit on label stack size */
+ if (new_stack->num_labels > MPLS_MAX_LABELS)
+ new_stack->num_labels = MPLS_MAX_LABELS;
+
+ /* Resize the array to accommodate the new label stack */
+ if (new_stack->num_labels > nexthop->nh_label->num_labels) {
+ nh_label_tmp = XREALLOC(MTYPE_NH_LABEL, nexthop->nh_label,
+ sizeof(struct mpls_label_stack) +
+ new_stack->num_labels * sizeof(mpls_label_t));
+ if (nh_label_tmp) {
+ nexthop->nh_label = nh_label_tmp;
+ nexthop->nh_label->num_labels = new_stack->num_labels;
+ } else
+ new_stack->num_labels = nexthop->nh_label->num_labels;
+ }
+
+ /* Copy the label stack into the array */
+ for (i = 0; i < new_stack->num_labels; i++)
+ nexthop->nh_label->label[i] = new_stack->label[i];
+}
+
void nexthop_add_srv6_seg6local(struct nexthop *nexthop, uint32_t action,
const struct seg6local_context *ctx)
{
diff --git a/lib/nexthop.h b/lib/nexthop.h
index 02ea4d96f2..5dfb58d846 100644
--- a/lib/nexthop.h
+++ b/lib/nexthop.h
@@ -154,6 +154,8 @@ void nexthops_free(struct nexthop *nexthop);
void nexthop_add_labels(struct nexthop *nexthop, enum lsp_types_t ltype,
uint8_t num_labels, const mpls_label_t *labels);
void nexthop_del_labels(struct nexthop *);
+void nexthop_change_labels(struct nexthop *nexthop, struct mpls_label_stack *new_stack);
+
void nexthop_add_srv6_seg6local(struct nexthop *nexthop, uint32_t action,
const struct seg6local_context *ctx);
void nexthop_del_srv6_seg6local(struct nexthop *nexthop);
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c
index 9549af5f14..0d3fd2a726 100644
--- a/zebra/zebra_mpls.c
+++ b/zebra/zebra_mpls.c
@@ -37,7 +37,6 @@
DEFINE_MTYPE_STATIC(ZEBRA, LSP, "MPLS LSP object");
DEFINE_MTYPE_STATIC(ZEBRA, FEC, "MPLS FEC object");
DEFINE_MTYPE_STATIC(ZEBRA, NHLFE, "MPLS nexthop object");
-DEFINE_MTYPE_STATIC(ZEBRA, NH_LABEL, "Nexthop label");
bool mpls_enabled;
bool mpls_pw_reach_strict; /* Strict reachability checking */
@@ -1453,31 +1452,7 @@ static int nhlfe_del(struct zebra_nhlfe *nhlfe)
static void nhlfe_out_label_update(struct zebra_nhlfe *nhlfe,
struct mpls_label_stack *nh_label)
{
- struct mpls_label_stack *nh_label_tmp;
- int i;
-
- /* Enforce limit on label stack size */
- if (nh_label->num_labels > MPLS_MAX_LABELS)
- nh_label->num_labels = MPLS_MAX_LABELS;
-
- /* Resize the array to accommodate the new label stack */
- if (nh_label->num_labels > nhlfe->nexthop->nh_label->num_labels) {
- nh_label_tmp = XREALLOC(MTYPE_NH_LABEL, nhlfe->nexthop->nh_label,
- sizeof(struct mpls_label_stack) +
- nh_label->num_labels *
- sizeof(mpls_label_t));
- if (nh_label_tmp) {
- nhlfe->nexthop->nh_label = nh_label_tmp;
- nhlfe->nexthop->nh_label->num_labels =
- nh_label->num_labels;
- } else
- nh_label->num_labels =
- nhlfe->nexthop->nh_label->num_labels;
- }
-
- /* Copy the label stack into the array */
- for (i = 0; i < nh_label->num_labels; i++)
- nhlfe->nexthop->nh_label->label[i] = nh_label->label[i];
+ nexthop_change_labels(nhlfe->nexthop, nh_label);
}
static int mpls_lsp_uninstall_all(struct hash *lsp_table, struct zebra_lsp *lsp,