Received: by 10.223.176.46 with SMTP id f43csp212658wra; Thu, 25 Jan 2018 20:34:51 -0800 (PST) X-Google-Smtp-Source: AH8x225BnLXlC9+icCPvKIJhPO3DonN9zHJhVGlCKKN2DfbCaINVwMdudOX+auyPw9dli0d1VZsa X-Received: by 2002:a17:902:b094:: with SMTP id p20-v6mr13597393plr.391.1516941291816; Thu, 25 Jan 2018 20:34:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516941291; cv=none; d=google.com; s=arc-20160816; b=yhdpzmRZpqB4aFOEYyu+stavkv1LGs+zkIeXwjVovamrpr19VZVHPLwrCNsjRu1ern mNp+EcfO7tdt5qX/Ve6sDMw8BQB9vxQDzelo2RhNrWzcngnyGu9mPduM/iL8NH4zR1zN uhxXfhPuOla892CszBYe3/RTQlFk4dXUuH86sLhVjMUoRiabtnnbe0OYzGQVIfS2zQKP +68N3ZYSRa9mlGnlgW7Qaes+jHeyGQFLxKiL0WFy6al5tb0RdbwApX8htikns4QAd7AS lS3XlBLV5iKDFA2KK5N/ochdUm3N6M6GCFEvUOMkV7sshn8jI7suRseZIf0dChfWAWm5 6eNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-id:content-language:accept-language:in-reply-to:references :message-id:date:thread-index:thread-topic:subject:cc:to:from :arc-authentication-results; bh=JGvh2oC/nHS1hV7qwfQOonGrECOcVQCaVQrA9Yb1Rdo=; b=chWiaDtuUm3pMYMHkOpq66WyZXsd4Cah1mnoiHqHqIgdAD2McIJyZctVap6JoJPnFE jIrMFpBPLLtwBU3K6rUCZWDzDJLuEx/EPVBV4nKR2V07+5WOe689mKyc9EwfGgtBS0rL 6sqiuxIbHw9uE07Ut8pVjNgiUY6Ur3exIRuE6YN9JFdNAt+aXRyfbFZNaMVREVGbqDBm 5pCuNen2QZ9hHj/09R3qdWZHUIX8s3A6SNg2ueqcnS4cf5lznmMgCTHyaUE1fmW3+zSl eDhroR7VbFCiBDfkTv7w5Om36lhqLE4EuTLgT72NTmJzYI2+nRKmXV8mrNhDCmN6rrr5 aazA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t130si2507391pgc.236.2018.01.25.20.34.37; Thu, 25 Jan 2018 20:34:51 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751429AbeAZEeL convert rfc822-to-8bit (ORCPT + 99 others); Thu, 25 Jan 2018 23:34:11 -0500 Received: from mga01.intel.com ([192.55.52.88]:30414 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750823AbeAZEeK (ORCPT ); Thu, 25 Jan 2018 23:34:10 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jan 2018 20:34:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,415,1511856000"; d="scan'208";a="196378669" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga005.jf.intel.com with ESMTP; 25 Jan 2018 20:34:09 -0800 Received: from fmsmsx153.amr.corp.intel.com (10.18.125.6) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 25 Jan 2018 20:34:08 -0800 Received: from FMSMSX109.amr.corp.intel.com ([169.254.15.91]) by FMSMSX153.amr.corp.intel.com ([169.254.9.82]) with mapi id 14.03.0319.002; Thu, 25 Jan 2018 20:34:08 -0800 From: "Dilger, Andreas" To: "Eremin, Dmitry" CC: Greg Kroah-Hartman , "devel@driverdev.osuosl.org" , "Drokin, Oleg" , James Simmons , "Linux Kernel Mailing List" , Lustre Development List , "stable@vger.kernel.org" Subject: Re: [PATCH v4] staging: lustre: separate a connection destroy from free struct kib_conn Thread-Topic: [PATCH v4] staging: lustre: separate a connection destroy from free struct kib_conn Thread-Index: AQHTleOd5DtaQm4MTEqqYegtFgN8k6OGGCEA Date: Fri, 26 Jan 2018 04:34:07 +0000 Message-ID: <33F9CC96-70A5-4B03-9434-64DD37532B29@intel.com> References: <20180124142954.GA4658@kroah.com> <1516888264-26273-1-git-send-email-dmitry.eremin@intel.com> In-Reply-To: <1516888264-26273-1-git-send-email-dmitry.eremin@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.103.2] Content-Type: text/plain; charset="us-ascii" Content-ID: <8C8272F027432D4BBA9FC1D704283965@intel.com> Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Jan 25, 2018, at 06:51, Eremin, Dmitry 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: # v4.6 > Fixes: 4d99b2581eff ("staging: lustre: avoid intensive reconnecting for ko2iblnd") > Signed-off-by: Dmitry Eremin Reviewed-by: Andreas Dilger > --- > 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