Commit 5a5fac99 authored by Ayush Sawal's avatar Ayush Sawal Committed by Jakub Kicinski

chtls: Fix panic when route to peer not configured

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: cc35c88a ("crypto : chtls - CPL handler definition")
Signed-off-by: default avatarRohit Maheshwari <rohitm@chelsio.com>
Signed-off-by: default avatarAyush Sawal <ayush.sawal@chelsio.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 827d3291
...@@ -1109,6 +1109,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk, ...@@ -1109,6 +1109,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
const struct cpl_pass_accept_req *req, const struct cpl_pass_accept_req *req,
struct chtls_dev *cdev) struct chtls_dev *cdev)
{ {
struct adapter *adap = pci_get_drvdata(cdev->pdev);
struct neighbour *n = NULL; struct neighbour *n = NULL;
struct inet_sock *newinet; struct inet_sock *newinet;
const struct iphdr *iph; const struct iphdr *iph;
...@@ -1118,9 +1119,10 @@ static struct sock *chtls_recv_sock(struct sock *lsk, ...@@ -1118,9 +1119,10 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
struct dst_entry *dst; struct dst_entry *dst;
struct tcp_sock *tp; struct tcp_sock *tp;
struct sock *newsk; struct sock *newsk;
bool found = false;
u16 port_id; u16 port_id;
int rxq_idx; int rxq_idx;
int step; int step, i;
iph = (const struct iphdr *)network_hdr; iph = (const struct iphdr *)network_hdr;
newsk = tcp_create_openreq_child(lsk, oreq, cdev->askb); newsk = tcp_create_openreq_child(lsk, oreq, cdev->askb);
...@@ -1152,7 +1154,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk, ...@@ -1152,7 +1154,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
n = dst_neigh_lookup(dst, &ip6h->saddr); n = dst_neigh_lookup(dst, &ip6h->saddr);
#endif #endif
} }
if (!n) if (!n || !n->dev)
goto free_sk; goto free_sk;
ndev = n->dev; ndev = n->dev;
...@@ -1161,6 +1163,13 @@ static struct sock *chtls_recv_sock(struct sock *lsk, ...@@ -1161,6 +1163,13 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
if (is_vlan_dev(ndev)) if (is_vlan_dev(ndev))
ndev = vlan_dev_real_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); port_id = cxgb4_port_idx(ndev);
csk = chtls_sock_create(cdev); csk = chtls_sock_create(cdev);
...@@ -1238,6 +1247,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk, ...@@ -1238,6 +1247,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
free_csk: free_csk:
chtls_sock_release(&csk->kref); chtls_sock_release(&csk->kref);
free_dst: free_dst:
neigh_release(n);
dst_release(dst); dst_release(dst);
free_sk: free_sk:
inet_csk_prepare_forced_close(newsk); inet_csk_prepare_forced_close(newsk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment