Skip to content

Commit

Permalink
isisd: fix rcap tlv double-free crash
Browse files Browse the repository at this point in the history
Fix rcap tlv double-free crash.

It is supposed to be freed later by isis_free_tlvs() ->
free_tlv_router_cap(). In 78774bb ("isisd: add isis flex-algo lsp
advertisement"), this was not the case because rcap was not saved to
tlvs->router_cap when the function returned early because of a subTLV
length issue.

Fixes: 49efc80 ("isisd: Ensure rcap is freed in error case")
Fixes: 78774bb ("isisd: add isis flex-algo lsp advertisement")
Signed-off-by: Louis Scalbert <[email protected]>
  • Loading branch information
louis-6wind committed Sep 16, 2024
1 parent bf1fa1b commit 9be69a4
Showing 1 changed file with 8 additions and 9 deletions.
17 changes: 8 additions & 9 deletions isisd/isis_tlvs.c
Original file line number Diff line number Diff line change
Expand Up @@ -6147,16 +6147,17 @@ static int unpack_tlv_router_cap(enum isis_tlv_context context,
return 0;
}

if (tlvs->router_cap)
/* Multiple Router Capability found */
rcap = tlvs->router_cap;
else {
/* Allocate router cap structure and initialize SR Algorithms */
rcap = XCALLOC(MTYPE_ISIS_TLV, sizeof(struct isis_router_cap));
if (!tlvs->router_cap) {
/* First Router Capability TLV.
* Allocate router cap structure and initialize SR Algorithms */
tlvs->router_cap = XCALLOC(MTYPE_ISIS_TLV,
sizeof(struct isis_router_cap));
for (int i = 0; i < SR_ALGORITHM_COUNT; i++)
rcap->algo[i] = SR_ALGORITHM_UNSET;
tlvs->router_cap->algo[i] = SR_ALGORITHM_UNSET;
}

rcap = tlvs->router_cap;

/* Get Router ID and Flags */
rcap->router_id.s_addr = stream_get_ipv4(s);
rcap->flags = stream_getc(s);
Expand All @@ -6178,7 +6179,6 @@ static int unpack_tlv_router_cap(enum isis_tlv_context context,
log, indent,
"WARNING: Router Capability subTLV length too large compared to expected size\n");
stream_forward_getp(s, STREAM_READABLE(s));
XFREE(MTYPE_ISIS_TLV, rcap);
return 0;
}

Expand Down Expand Up @@ -6489,7 +6489,6 @@ static int unpack_tlv_router_cap(enum isis_tlv_context context,
}
subtlv_len = subtlv_len - length - 2;
}
tlvs->router_cap = rcap;
return 0;
}

Expand Down

0 comments on commit 9be69a4

Please sign in to comment.