Merge branch 'chelsio-chtls-fix-inline-tls-bugs'
Vinay Kumar Yadav says: ==================== chelsio/chtls: Fix inline tls bugs This series of patches fix following bugs in chelsio inline tls driver. Patch1: Fix incorrect socket lock. Patch2: correct netdevice for vlan interface. Patch3: Fix panic when server is listening on ipv6. Patch4: Fix panic when listen on multiadapter. Patch5: correct function return and return type. Patch6: Fix writing freed memory. ==================== Link: https://lore.kernel.org/r/20201019115025.24233-1-vinay.yadav@chelsio.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
d1ffbf283b
@ -92,11 +92,13 @@ static void chtls_sock_release(struct kref *ref)
|
||||
static struct net_device *chtls_find_netdev(struct chtls_dev *cdev,
|
||||
struct sock *sk)
|
||||
{
|
||||
struct adapter *adap = pci_get_drvdata(cdev->pdev);
|
||||
struct net_device *ndev = cdev->ports[0];
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct net_device *temp;
|
||||
int addr_type;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
switch (sk->sk_family) {
|
||||
case PF_INET:
|
||||
@ -127,8 +129,12 @@ static struct net_device *chtls_find_netdev(struct chtls_dev *cdev,
|
||||
return NULL;
|
||||
|
||||
if (is_vlan_dev(ndev))
|
||||
return vlan_dev_real_dev(ndev);
|
||||
return ndev;
|
||||
ndev = vlan_dev_real_dev(ndev);
|
||||
|
||||
for_each_port(adap, i)
|
||||
if (cdev->ports[i] == ndev)
|
||||
return ndev;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void assign_rxopt(struct sock *sk, unsigned int opt)
|
||||
@ -477,7 +483,6 @@ void chtls_destroy_sock(struct sock *sk)
|
||||
chtls_purge_write_queue(sk);
|
||||
free_tls_keyid(sk);
|
||||
kref_put(&csk->kref, chtls_sock_release);
|
||||
csk->cdev = NULL;
|
||||
if (sk->sk_family == AF_INET)
|
||||
sk->sk_prot = &tcp_prot;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
@ -736,14 +741,13 @@ void chtls_listen_stop(struct chtls_dev *cdev, struct sock *sk)
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (sk->sk_family == PF_INET6) {
|
||||
struct chtls_sock *csk;
|
||||
struct net_device *ndev = chtls_find_netdev(cdev, sk);
|
||||
int addr_type = 0;
|
||||
|
||||
csk = rcu_dereference_sk_user_data(sk);
|
||||
addr_type = ipv6_addr_type((const struct in6_addr *)
|
||||
&sk->sk_v6_rcv_saddr);
|
||||
if (addr_type != IPV6_ADDR_ANY)
|
||||
cxgb4_clip_release(csk->egress_dev, (const u32 *)
|
||||
cxgb4_clip_release(ndev, (const u32 *)
|
||||
&sk->sk_v6_rcv_saddr, 1);
|
||||
}
|
||||
#endif
|
||||
@ -1157,6 +1161,9 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
|
||||
ndev = n->dev;
|
||||
if (!ndev)
|
||||
goto free_dst;
|
||||
if (is_vlan_dev(ndev))
|
||||
ndev = vlan_dev_real_dev(ndev);
|
||||
|
||||
port_id = cxgb4_port_idx(ndev);
|
||||
|
||||
csk = chtls_sock_create(cdev);
|
||||
|
@ -902,9 +902,9 @@ static int chtls_skb_copy_to_page_nocache(struct sock *sk,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int csk_mem_free(struct chtls_dev *cdev, struct sock *sk)
|
||||
static bool csk_mem_free(struct chtls_dev *cdev, struct sock *sk)
|
||||
{
|
||||
return (cdev->max_host_sndbuf - sk->sk_wmem_queued);
|
||||
return (cdev->max_host_sndbuf - sk->sk_wmem_queued > 0);
|
||||
}
|
||||
|
||||
static int csk_wait_memory(struct chtls_dev *cdev,
|
||||
@ -1240,6 +1240,7 @@ int chtls_sendpage(struct sock *sk, struct page *page,
|
||||
copied = 0;
|
||||
csk = rcu_dereference_sk_user_data(sk);
|
||||
cdev = csk->cdev;
|
||||
lock_sock(sk);
|
||||
timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
|
||||
|
||||
err = sk_stream_wait_connect(sk, &timeo);
|
||||
|
Loading…
x
Reference in New Issue
Block a user