VPP-1420 CDP check memory bounds fix

Change-Id: I7951ffd050acb618dd20b86ae5946e1228ff5d79
Signed-off-by: Filip Varga <fivarga@cisco.com>
This commit is contained in:
Filip Varga
2018-10-22 12:36:58 +02:00
committed by Damjan Marion
parent 31555a3475
commit 115a3ac59a

View File

@ -250,7 +250,7 @@ process_cdp_hdr (cdp_main_t * cm, cdp_neighbor_t * n, cdp_hdr_t * h)
static int
cdp_packet_scan (cdp_main_t * cm, cdp_neighbor_t * n)
{
u8 *cur = n->last_rx_pkt;
u8 *end, *cur = n->last_rx_pkt;
cdp_hdr_t *h;
cdp_tlv_t *tlv;
cdp_error_t e = CDP_ERROR_NONE;
@ -269,13 +269,24 @@ cdp_packet_scan (cdp_main_t * cm, cdp_neighbor_t * n)
if (e)
return e;
cur = (u8 *) (h + 1);
// there are no tlvs
if (vec_len (n->last_rx_pkt) <= 0)
return CDP_ERROR_BAD_TLV;
while (cur < n->last_rx_pkt + vec_len (n->last_rx_pkt) - 1)
cur = (u8 *) (h + 1);
end = n->last_rx_pkt + vec_len (n->last_rx_pkt) - 1;
// look ahead 4 bytes (u16 tlv->t + u16 tlv->l)
while (cur + 3 <= end)
{
tlv = (cdp_tlv_t *) cur;
tlv->t = ntohs (tlv->t);
tlv->l = ntohs (tlv->l);
/* tlv length includes t, l and v */
cur += tlv->l;
if ((cur - 1) > end)
return CDP_ERROR_BAD_TLV;
/*
* Only process known TLVs. In practice, certain
* devices send tlv->t = 0xFF, perhaps as an EOF of sorts.
@ -288,10 +299,12 @@ cdp_packet_scan (cdp_main_t * cm, cdp_neighbor_t * n)
if (e)
return e;
}
/* tlv length includes (t, l) */
cur += tlv->l;
}
// did not process all tlvs or none tlv processed
if ((cur - 1) != end)
return CDP_ERROR_BAD_TLV;
return CDP_ERROR_NONE;
}