From: Boris Pismenny <borisp@mellanox.com>
To: Saeed Mahameed <saeedm@mellanox.com>,
"eric.dumazet@gmail.com" <eric.dumazet@gmail.com>,
"pakki001@umn.edu" <pakki001@umn.edu>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-rdma@vger.kernel.org" <linux-rdma@vger.kernel.org>,
"weiyongjun1@huawei.com" <weiyongjun1@huawei.com>,
"kjlu@umn.edu" <kjlu@umn.edu>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
Ilya Lesokhin <ilyal@mellanox.com>,
"davem@davemloft.net" <davem@davemloft.net>,
"leon@kernel.org" <leon@kernel.org>
Subject: Re: [PATCH v4] net: mlx5: Add a missing check on idr_find, free buf
Date: Wed, 20 Mar 2019 09:49:25 +0000 [thread overview]
Message-ID: <3549f722-bf9b-087b-b4d5-8d588f675eaa@mellanox.com> (raw)
In-Reply-To: <c44f3a3f0d74e65b1db9544cf50555f76c8daab4.camel@mellanox.com>
On 3/20/2019 7:02 AM, Saeed Mahameed wrote:
> On Tue, 2019-03-19 at 21:54 -0700, Eric Dumazet wrote:
>>
>> On 03/19/2019 02:42 PM, Aditya Pakki wrote:
>>> idr_find() can return a NULL value to 'flow' which is used without
>>> a
>>> check. The patch adds a check to avoid potential NULL pointer
>>> dereference.
>>>
>>> In case of mlx5_fpga_sbu_conn_sendmsg() failure, free buf allocated
>>> using kzalloc.
>>>
>>> Fixes: ab412e1dd7db ("net/mlx5: Accel, add TLS rx offload
>>> routines")
>>> ---
>>> v3: Reorder buf allocations and flow check.
>>> v2: failure to return in case of flow failure.
>>> v1: Failed to free buf in case of flow failure.
>>>
>>> Signed-off-by: Aditya Pakki <pakki001@umn.edu>
>>> ---
>>> drivers/net/ethernet/mellanox/mlx5/core/fpga/tls.c | 14
>>> +++++++++++---
>>> 1 file changed, 11 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/tls.c
>>> b/drivers/net/ethernet/mellanox/mlx5/core/fpga/tls.c
>>> index 5cf5f2a9d51f..8de64e88c670 100644
>>> --- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/tls.c
>>> +++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/tls.c
>>> @@ -217,15 +217,21 @@ int mlx5_fpga_tls_resync_rx(struct
>>> mlx5_core_dev *mdev, u32 handle, u32 seq,
>>> void *cmd;
>>> int ret;
>>>
>>> + rcu_read_lock();
>>> + flow = idr_find(&mdev->fpga->tls->rx_idr, ntohl(handle));
>>> + rcu_read_unlock();
>>
>> This looks suspect (even before your patch)
>>
>> What prevents flow from disappearing after this rcu_read_lock() ?
>>
>> IMO your patch might prevent a NULL deref, but not use-after-free.
>
> That crossed my mind when i reviewed this patch but since this is an
> old issue i just put a todo aside to handle it later
>
> i think the author didn't want to deal with use-after-free here, but
> only wanted to keep the data structure safe against add/remove
> operations.
>
> Anyway all we need here is
>
> rcu_read_lock()
> flow = idr_find(..)
> mlx5_fpga_tls_flow_to_cmd(flow, cmd);
> rcu_read_unlock()
>
> Will fix it up in a follow up patch,
>
> Thank you Eric !!
>
This flow won't be removed unless the tcp connection call sk_destruct or
the netdev is removed.
Thus, this lookup should *always* succeed.
This, is also why I wanted to ask Aditya if this flow was actually
encountered in practice. I'm sure that if our assumption about the
safety of this flow breaks, then other parts of the TLS driver will fail
as well.
>
>>
>>> +
>>> + if (!flow) {
>>> + WARN_ONCE(1, "Received NULL pointer for handle\n");
>>> + return -EINVAL;
>>> + }
>>> +
>>> buf = kzalloc(size, GFP_ATOMIC);
>>> if (!buf)
>>> return -ENOMEM;
>>>
>>> cmd = (buf + 1);
>>>
>>> - rcu_read_lock();
>>> - flow = idr_find(&mdev->fpga->tls->rx_idr, ntohl(handle));
>>> - rcu_read_unlock();
>>> mlx5_fpga_tls_flow_to_cmd(flow, cmd);
>>>
>>> MLX5_SET(tls_cmd, cmd, swid, ntohl(handle));
>>> @@ -238,6 +244,8 @@ int mlx5_fpga_tls_resync_rx(struct
>>> mlx5_core_dev *mdev, u32 handle, u32 seq,
>>> buf->complete = mlx_tls_kfree_complete;
>>>
>>> ret = mlx5_fpga_sbu_conn_sendmsg(mdev->fpga->tls->conn, buf);
>>> + if (ret < 0)
>>> + kfree(buf);
>>>
>>> return ret;
>>> }
>>>
prev parent reply other threads:[~2019-03-20 9:49 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-19 21:42 Aditya Pakki
2019-03-19 22:37 ` Saeed Mahameed
2019-03-20 4:54 ` Eric Dumazet
2019-03-20 5:02 ` Saeed Mahameed
2019-03-20 9:49 ` Boris Pismenny [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3549f722-bf9b-087b-b4d5-8d588f675eaa@mellanox.com \
--to=borisp@mellanox.com \
--cc=davem@davemloft.net \
--cc=eric.dumazet@gmail.com \
--cc=ilyal@mellanox.com \
--cc=kjlu@umn.edu \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pakki001@umn.edu \
--cc=saeedm@mellanox.com \
--cc=weiyongjun1@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®