Skip to content

Commit

Permalink
Merge pull request #5584 from qlyoung/pim-fix-iph-trust
Browse files Browse the repository at this point in the history
pimd: readd iph length checks
  • Loading branch information
Jafaral authored Dec 22, 2019
2 parents 959abfc + f08e675 commit 1a457dc
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
22 changes: 15 additions & 7 deletions pimd/pim_igmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -478,23 +478,31 @@ int pim_igmp_packet(struct igmp_sock *igmp, char *buf, size_t len)

ip_hlen = ip_hdr->ip_hl << 2; /* ip_hl gives length in 4-byte words */

if (ip_hlen > len) {
zlog_warn(
"IGMP packet header claims size %zu, but we only have %zu bytes",
ip_hlen, len);
return -1;
}

igmp_msg = buf + ip_hlen;
msg_type = *igmp_msg;
igmp_msg_len = len - ip_hlen;

if (igmp_msg_len < PIM_IGMP_MIN_LEN) {
zlog_warn("IGMP message size=%d shorter than minimum=%d",
igmp_msg_len, PIM_IGMP_MIN_LEN);
return -1;
}

msg_type = *igmp_msg;

if (PIM_DEBUG_IGMP_PACKETS) {
zlog_debug(
"Recv IGMP packet from %s to %s on %s: size=%zu ttl=%d msg_type=%d msg_size=%d",
from_str, to_str, igmp->interface->name, len, ip_hdr->ip_ttl,
msg_type, igmp_msg_len);
}

if (igmp_msg_len < PIM_IGMP_MIN_LEN) {
zlog_warn("IGMP message size=%d shorter than minimum=%d",
igmp_msg_len, PIM_IGMP_MIN_LEN);
return -1;
}

switch (msg_type) {
case PIM_IGMP_MEMBERSHIP_QUERY: {
int max_resp_code = igmp_msg[1];
Expand Down
3 changes: 3 additions & 0 deletions pimd/pim_mroute.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,9 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf,
struct in_addr ifaddr;
struct igmp_sock *igmp;

if (buf_size < (int)sizeof(struct ip))
return 0;

ip_hdr = (const struct ip *)buf;

if (ip_hdr->ip_p == IPPROTO_IGMP) {
Expand Down

0 comments on commit 1a457dc

Please sign in to comment.