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
Patch-mainline: v5.11-rc3
Git-commit: 5a5fac9966bb6d513198634b0b1357be7e8447d2
References: git-fixes
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>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
drivers/crypto/chelsio/chtls/chtls_cm.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
--- a/drivers/crypto/chelsio/chtls/chtls_cm.c
+++ b/drivers/crypto/chelsio/chtls/chtls_cm.c
@@ -1027,12 +1027,15 @@ static struct sock *chtls_recv_sock(stru
struct net_device *ndev;
struct chtls_sock *csk;
struct dst_entry *dst;
+ struct adapter *adap;
+ struct port_info *pi;
struct neighbour *n;
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);
@@ -1044,7 +1047,7 @@ static struct sock *chtls_recv_sock(stru
goto free_sk;
n = dst_neigh_lookup(dst, &iph->saddr);
- if (!n)
+ if (!n || !n->dev)
goto free_sk;
ndev = n->dev;
@@ -1053,6 +1056,15 @@ static struct sock *chtls_recv_sock(stru
if (is_vlan_dev(ndev))
ndev = vlan_dev_real_dev(ndev);
+ pi = netdev_priv(ndev);
+ adap = pi->adapter;
+ 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);
@@ -1108,6 +1120,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);