From: "Dilger, Andreas" <andreas.dilger@intel.com>
To: "Eremin, Dmitry" <dmitry.eremin@intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"devel@driverdev.osuosl.org" <devel@driverdev.osuosl.org>,
"Drokin, Oleg" <oleg.drokin@intel.com>,
James Simmons <jsimmons@infradead.org>,
"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
Lustre Development List <lustre-devel@lists.lustre.org>,
"stable@vger.kernel.org" <stable@vger.kernel.org>
Subject: Re: [PATCH v4] staging: lustre: separate a connection destroy from free struct kib_conn
Date: Fri, 26 Jan 2018 04:34:07 +0000 [thread overview]
Message-ID: <33F9CC96-70A5-4B03-9434-64DD37532B29@intel.com> (raw)
In-Reply-To: <1516888264-26273-1-git-send-email-dmitry.eremin@intel.com>
On Jan 25, 2018, at 06:51, Eremin, Dmitry <dmitry.eremin@intel.com> wrote:
>
> The logic of the original commit 4d99b2581eff ("staging: lustre: avoid
> intensive reconnecting for ko2iblnd") was assumed conditional free of
> struct kib_conn if the second argument free_conn in function
> kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn) is true.
> But this hunk of code was dropped from original commit. As result the logic
> works wrong and current code use struct kib_conn after free.
>
>> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
>> 3317 kiblnd_destroy_conn(conn, !peer);
>> ^^^^ Freed always (but should be conditionally)
>> 3318
>> 3319 spin_lock_irqsave(lock, flags);
>> 3320 if (!peer)
>> 3321 continue;
>> 3322
>> 3323 conn->ibc_peer = peer;
>> ^^^^^^^^^^^^^^ Use after free
>> 3324 if (peer->ibp_reconnected < KIB_RECONN_HIGH_RACE)
>> 3325 list_add_tail(&conn->ibc_list,
>> ^^^^^^^^^^^^^^ Use after free
>> 3326 &kiblnd_data.kib_reconn_list);
>> 3327 else
>> 3328 list_add_tail(&conn->ibc_list,
>> ^^^^^^^^^^^^^^ Use after free
>> 3329 &kiblnd_data.kib_reconn_wait);
>
> To avoid confusion this fix moved the freeing a struct kib_conn outside of
> the function kiblnd_destroy_conn() and free as it was intended in original
> commit.
>
> Cc: <stable@vger.kernel.org> # v4.6
> Fixes: 4d99b2581eff ("staging: lustre: avoid intensive reconnecting for ko2iblnd")
> Signed-off-by: Dmitry Eremin <Dmitry.Eremin@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
> ---
> Changes in v4:
> - fixed the issue with use after free by moving the freeing a struct
> kib_conn outside of the function kiblnd_destroy_conn()
>
> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c | 7 +++----
> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h | 2 +-
> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c | 6 ++++--
> 3 files changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> index 2ebc484385b3..ec84edfda271 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> @@ -824,14 +824,15 @@ struct kib_conn *kiblnd_create_conn(struct kib_peer *peer, struct rdma_cm_id *cm
> return conn;
>
> failed_2:
> - kiblnd_destroy_conn(conn, true);
> + kiblnd_destroy_conn(conn);
> + kfree(conn);
> failed_1:
> kfree(init_qp_attr);
> failed_0:
> return NULL;
> }
>
> -void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn)
> +void kiblnd_destroy_conn(struct kib_conn *conn)
> {
> struct rdma_cm_id *cmid = conn->ibc_cmid;
> struct kib_peer *peer = conn->ibc_peer;
> @@ -889,8 +890,6 @@ void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn)
> rdma_destroy_id(cmid);
> atomic_dec(&net->ibn_nconns);
> }
> -
> - kfree(conn);
> }
>
> int kiblnd_close_peer_conns_locked(struct kib_peer *peer, int why)
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
> index 171eced213f8..b18911d09e9a 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
> @@ -1016,7 +1016,7 @@ int kiblnd_close_stale_conns_locked(struct kib_peer *peer,
> struct kib_conn *kiblnd_create_conn(struct kib_peer *peer,
> struct rdma_cm_id *cmid,
> int state, int version);
> -void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn);
> +void kiblnd_destroy_conn(struct kib_conn *conn);
> void kiblnd_close_conn(struct kib_conn *conn, int error);
> void kiblnd_close_conn_locked(struct kib_conn *conn, int error);
>
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> index 9b3328c5d1e7..b3e7f28eb978 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> @@ -3314,11 +3314,13 @@ static int kiblnd_resolve_addr(struct rdma_cm_id *cmid,
> spin_unlock_irqrestore(lock, flags);
> dropped_lock = 1;
>
> - kiblnd_destroy_conn(conn, !peer);
> + kiblnd_destroy_conn(conn);
>
> spin_lock_irqsave(lock, flags);
> - if (!peer)
> + if (!peer) {
> + kfree(conn);
> continue;
> + }
>
> conn->ibc_peer = peer;
> if (peer->ibp_reconnected < KIB_RECONN_HIGH_RACE)
> --
> 1.8.3.1
>
Cheers, Andreas
--
Andreas Dilger
Lustre Principal Architect
Intel Corporation
prev parent reply other threads:[~2018-01-26 4:34 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1516114161-27679-1-git-send-email-Dmitry.Eremin@intel.com>
2018-01-16 15:01 ` [PATCH] staging: lustre: Fix avoid intensive reconnecting for ko2iblnd patch Eremin, Dmitry
2018-01-16 16:56 ` Greg Kroah-Hartman
2018-01-17 0:36 ` Dilger, Andreas
2018-01-17 14:02 ` Greg Kroah-Hartman
2018-01-16 18:02 ` Eremin, Dmitry
2018-01-22 10:39 ` Greg Kroah-Hartman
2018-01-24 12:45 ` [PATCH v2] " Dmitry Eremin
2018-01-24 14:14 ` [PATCH v3] staging: lustre: separate a connection destroy from free struct kib_conn Dmitry Eremin
2018-01-24 14:29 ` Greg Kroah-Hartman
2018-01-25 13:51 ` [PATCH v4] " Dmitry Eremin
2018-01-26 4:34 ` Dilger, Andreas [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=33F9CC96-70A5-4B03-9434-64DD37532B29@intel.com \
--to=andreas.dilger@intel.com \
--cc=devel@driverdev.osuosl.org \
--cc=dmitry.eremin@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=jsimmons@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lustre-devel@lists.lustre.org \
--cc=oleg.drokin@intel.com \
--cc=stable@vger.kernel.org \
/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®