Skip to content

Commit

Permalink
sctp: handle two v4 addrs comparison in sctp_inet6_cmp_addr
Browse files Browse the repository at this point in the history
Since sctp ipv6 socket also supports v4 addrs, it's possible to
compare two v4 addrs in pf v6 .cmp_addr, sctp_inet6_cmp_addr.

However after Commit 1071ec9 ("sctp: do not check port in
sctp_inet6_cmp_addr"), it no longer calls af1->cmp_addr, which
in this case is sctp_v4_cmp_addr, but calls __sctp_v6_cmp_addr
where it handles them as two v6 addrs. It would cause a out of
bounds crash.

syzbot found this crash when trying to bind two v4 addrs to a
v6 socket.

This patch fixes it by adding the process for two v4 addrs in
sctp_inet6_cmp_addr.

Fixes: 1071ec9 ("sctp: do not check port in sctp_inet6_cmp_addr")
Reported-by: [email protected]
Signed-off-by: Xin Long <[email protected]>
Acked-by: Neil Horman <[email protected]>
Acked-by: Marcelo Ricardo Leitner <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
lxin authored and davem330 committed Apr 27, 2018
1 parent 1f3ccc3 commit d625329
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions net/sctp/ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -895,6 +895,9 @@ static int sctp_inet6_cmp_addr(const union sctp_addr *addr1,
if (sctp_is_any(sk, addr1) || sctp_is_any(sk, addr2))
return 1;

if (addr1->sa.sa_family == AF_INET && addr2->sa.sa_family == AF_INET)
return addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr;

return __sctp_v6_cmp_addr(addr1, addr2);
}

Expand Down

0 comments on commit d625329

Please sign in to comment.