diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sctp/protocol.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index fa80fe4f2362..4345790ad326 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -487,6 +487,8 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, */ rcu_read_lock(); list_for_each_entry_rcu(laddr, &bp->address_list, list) { + struct net_device *odev; + if (!laddr->valid) continue; if (laddr->state != SCTP_ADDR_SRC || @@ -504,6 +506,14 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, if (IS_ERR(rt)) continue; + /* Ensure the src address belongs to the output + * interface. + */ + odev = __ip_dev_find(sock_net(sk), laddr->a.v4.sin_addr.s_addr, + false); + if (!odev || odev->ifindex != fl4->flowi4_oif) + continue; + dst = &rt->dst; break; } |