Commit d1ffbf28 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
parents 280e3ebd da1a039b
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -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);
		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);
+3 −2
Original line number Diff line number Diff line
@@ -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);