Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp301989pxx; Wed, 28 Oct 2020 05:24:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwP8nJcMbnDvHbptYCSVNOmMDIYPsohw8ImHzOBjuR2H+qPv428W0ZwJgAM5gZyFm2gtf+P X-Received: by 2002:a05:6402:1585:: with SMTP id c5mr7573022edv.278.1603887877970; Wed, 28 Oct 2020 05:24:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603887877; cv=none; d=google.com; s=arc-20160816; b=lni0SVAqzwipq85yAqmgotDzUFR5Jr6voZzG0iasMwtQmEI1Ajj0aMnt3EXMWzrsD8 fNleie1y8JFmLc0CJo95Fx7VpfBVAQW4A/a4T/SQkswIT0uezkbJskuI+1EP0HVYylsB XzvaENwduzMUUa3ysZDLQhfKM8ChKwl8AixbgdFg4DvhUb4VYDO1apZdMl5hS+NEIfvh vrWNWwtXorZQQ6mv0Yfx6ymAh/PjZWvM1qOjVdsmoOWLBN0PY3WRjlfAn1PjJNAwn4UV B0llH223XzplN1dvoKMhk7M5HxQlls5zMK2pvQit2rULgpmyarCxHDO68BaQjHEvxw3B hP5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=/0U00dosy5UmctOO0JC5H6m79JCMMnwfnryTt23FjsU=; b=I1xUaZb+MvWY+ALI98kUs+v3q6ZDfwOSibtLVKhqCC4yxxFxlGBv3ZG7bFLwRYSB1p M1NDFi9JW6DUNbb7BHreisWZg4HtuE0Hc6bi0EcPnFMmPsbozmeeAyYzvyHSkpLNJ7e0 rL4SbiPDgZjGTuGDt9sbLipkMxZdWtlcwSgoun+LCW2kFXOL0ZxaAov0gDmrM0KtA7j0 VIrWJ3i4vvqodjNSa/K9SuKJXO/QwXMkxTb6fqNM2pVy6V0QgwiXATYH7aQ4sePgWrVh O6oSlKz7e00UEaLF6sHdltrax5UK2TYZ+soQOkJ7124eIeuZQaKN48ssEwVp+UJGVF51 uvnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=K0lOppnM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s16si2897729edy.300.2020.10.28.05.24.15; Wed, 28 Oct 2020 05:24:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=K0lOppnM; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1796771AbgJ0PTv (ORCPT + 99 others); Tue, 27 Oct 2020 11:19:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:52316 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1795887AbgJ0PPY (ORCPT ); Tue, 27 Oct 2020 11:15:24 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C2E0721D41; Tue, 27 Oct 2020 15:15:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603811724; bh=ccfMSBtyYsuJVMxC+7PNxuOzjyfmMrrqCrfQSwg9WK4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K0lOppnMHpbmTk/SkfDUn5lf9O44VP78NG6k5GHMdMDWd0d2xlvHB3HlqIcSZXr+c kJiSX6nmGdQ4fo/AzGz3huPSs10WccmIlSQis3YUlxA5UFXjoN/lGIKOPDbOC9iSQy 40fWxcHHPQ93JlZUQIneeMs8LzIADir+NUOrf/e4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Martin Wilck , Arun Easi , Daniel Wagner , "Martin K. Petersen" , Sasha Levin Subject: [PATCH 5.8 595/633] scsi: qla2xxx: Warn if done() or free() are called on an already freed srb Date: Tue, 27 Oct 2020 14:55:38 +0100 Message-Id: <20201027135550.732167402@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135522.655719020@linuxfoundation.org> References: <20201027135522.655719020@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Wagner [ Upstream commit c0014f94218ea3a312f6235febea0d626c5f2154 ] Emit a warning when ->done or ->free are called on an already freed srb. There is a hidden use-after-free bug in the driver which corrupts the srb memory pool which originates from the cleanup callbacks. An extensive search didn't bring any lights on the real problem. The initial fix was to set both pointers to NULL and try to catch invalid accesses. But instead the memory corruption was gone and the driver didn't crash. Since not all calling places check for NULL pointer, add explicitly default handlers. With this we workaround the memory corruption and add a debug help. Link: https://lore.kernel.org/r/20200908081516.8561-2-dwagner@suse.de Reviewed-by: Martin Wilck Reviewed-by: Arun Easi Signed-off-by: Daniel Wagner Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/qla2xxx/qla_init.c | 10 ++++++++++ drivers/scsi/qla2xxx/qla_inline.h | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 2861c636dd651..f17ab22ad0e4a 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -63,6 +63,16 @@ void qla2x00_sp_free(srb_t *sp) qla2x00_rel_sp(sp); } +void qla2xxx_rel_done_warning(srb_t *sp, int res) +{ + WARN_ONCE(1, "Calling done() of an already freed srb %p object\n", sp); +} + +void qla2xxx_rel_free_warning(srb_t *sp) +{ + WARN_ONCE(1, "Calling free() of an already freed srb %p object\n", sp); +} + /* Asynchronous Login/Logout Routines -------------------------------------- */ unsigned long diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h index 1fb6ccac07ccd..26d9c78d4c52c 100644 --- a/drivers/scsi/qla2xxx/qla_inline.h +++ b/drivers/scsi/qla2xxx/qla_inline.h @@ -207,10 +207,15 @@ qla2xxx_get_qpair_sp(scsi_qla_host_t *vha, struct qla_qpair *qpair, return sp; } +void qla2xxx_rel_done_warning(srb_t *sp, int res); +void qla2xxx_rel_free_warning(srb_t *sp); + static inline void qla2xxx_rel_qpair_sp(struct qla_qpair *qpair, srb_t *sp) { sp->qpair = NULL; + sp->done = qla2xxx_rel_done_warning; + sp->free = qla2xxx_rel_free_warning; mempool_free(sp, qpair->srb_mempool); QLA_QPAIR_MARK_NOT_BUSY(qpair); } -- 2.25.1