| From foo@baz Fri Jan 15 08:19:35 AM CET 2021 |
| From: Ayush Sawal <ayush.sawal@chelsio.com> |
| Date: Wed, 6 Jan 2021 09:59:08 +0530 |
| Subject: chtls: Fix panic when route to peer not configured |
| |
| From: Ayush Sawal <ayush.sawal@chelsio.com> |
| |
| [ Upstream commit 5a5fac9966bb6d513198634b0b1357be7e8447d2 ] |
| |
| If route to peer is not configured, we might get non tls |
| devices from dst_neigh_lookup() which is invalid, adding a |
| check to avoid it. |
| |
| Fixes: cc35c88ae4db ("crypto : chtls - CPL handler definition") |
| Signed-off-by: Rohit Maheshwari <rohitm@chelsio.com> |
| Signed-off-by: Ayush Sawal <ayush.sawal@chelsio.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c | 14 ++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c |
| +++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c |
| @@ -1109,6 +1109,7 @@ static struct sock *chtls_recv_sock(stru |
| const struct cpl_pass_accept_req *req, |
| struct chtls_dev *cdev) |
| { |
| + struct adapter *adap = pci_get_drvdata(cdev->pdev); |
| struct neighbour *n = NULL; |
| struct inet_sock *newinet; |
| const struct iphdr *iph; |
| @@ -1118,9 +1119,10 @@ static struct sock *chtls_recv_sock(stru |
| struct dst_entry *dst; |
| struct tcp_sock *tp; |
| struct sock *newsk; |
| + bool found = false; |
| u16 port_id; |
| int rxq_idx; |
| - int step; |
| + int step, i; |
| |
| iph = (const struct iphdr *)network_hdr; |
| newsk = tcp_create_openreq_child(lsk, oreq, cdev->askb); |
| @@ -1152,7 +1154,7 @@ static struct sock *chtls_recv_sock(stru |
| n = dst_neigh_lookup(dst, &ip6h->saddr); |
| #endif |
| } |
| - if (!n) |
| + if (!n || !n->dev) |
| goto free_sk; |
| |
| ndev = n->dev; |
| @@ -1161,6 +1163,13 @@ static struct sock *chtls_recv_sock(stru |
| if (is_vlan_dev(ndev)) |
| ndev = vlan_dev_real_dev(ndev); |
| |
| + for_each_port(adap, i) |
| + if (cdev->ports[i] == ndev) |
| + found = true; |
| + |
| + if (!found) |
| + goto free_dst; |
| + |
| port_id = cxgb4_port_idx(ndev); |
| |
| csk = chtls_sock_create(cdev); |
| @@ -1237,6 +1246,7 @@ static struct sock *chtls_recv_sock(stru |
| free_csk: |
| chtls_sock_release(&csk->kref); |
| free_dst: |
| + neigh_release(n); |
| dst_release(dst); |
| free_sk: |
| inet_csk_prepare_forced_close(newsk); |