Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp409614pxx; Wed, 28 Oct 2020 07:43:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKQyLjgy90EtpnojKb+/pd/5PCB3qZRF0Htcpk9TF+NTYpvfuPSxlLlPVDEVD+sLGIan+j X-Received: by 2002:a17:906:bc4b:: with SMTP id s11mr8085644ejv.437.1603896228072; Wed, 28 Oct 2020 07:43:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603896228; cv=none; d=google.com; s=arc-20160816; b=VjdAaFsCfPVEHZcKTS53c+I3gAFbLyqs9jRkzT1o8newt+tsGfZZi9oOGwzPLbDR8/ 5fnYPTwp6DgRVP2qWukLxT65XxsY1DogznLjdUYmLPZk41620IQ75GTeIIov4uBZcbLU lVWV5yJ5cULek5e99mpQfPGlPpEPpLjesQZFHp2HAkaNVbOLOrwlt1iQG8h8IIoNRZ7O e2XYeB09eH5uQ2m5V7wRM7tqx6Y6z7kBa4eFLZRHhKRIKuN5Ckm4Q9yM5oowE9rekLsh 87aeMTwnSsZeYpVJFX+DCVEBpNQKSr8p1wDyaZLFvjVXDnUYoQ7w9Vo1Dkjq+4/+ZBSU Bntw== 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=EIEu96u85YR3t2Iu4o9iQGZFZtEA1GygZiODMkEu/DI=; b=VXD24G+7Kok0XhQgoC+W9hDUjPITmdrPc7hvCypUTDFsmQDTJ5l+A4lJa6ldYgw9k3 XrIcI1pzjYiD/CTY6TWuM3ZDwz+KRcv3YrXeIFP7GIVXMg+RnITLmDiqfl4/kmycU5G0 0h9GC8xNwBia6lUhuyMngrCmfM+qIsmXOXC5zpbqC75x4wrBQZOTTg1JFQo3X7iGoEJg KkHpzDhXMVgIWfGRX1oi4ZOpAKQjHSol++RX0r71olrtwmRJtuHyUc017i1bCK+NIsIh WYwplGDLEP/hNrO8uCWmMjJ7+sBKcqWTGHoLm6oFkq93vLyqwb/gERw4iA+aZvICrEoQ mPNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jf5n6mzY; 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 bs17si3022913ejb.543.2020.10.28.07.43.25; Wed, 28 Oct 2020 07:43:48 -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=jf5n6mzY; 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 S1806818AbgJ0QIi (ORCPT + 99 others); Tue, 27 Oct 2020 12:08:38 -0400 Received: from mail.kernel.org ([198.145.29.99]:55228 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1803839AbgJ0Px3 (ORCPT ); Tue, 27 Oct 2020 11:53:29 -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 6F8FB20657; Tue, 27 Oct 2020 15:53:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603814009; bh=+Y0a2asrL7jAicrUGmb4DlOlW6Zj6PfPYrl0sTo8Acc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jf5n6mzYSqmAxNuxk3EKncTl387j08WI+p0yYwffUbC6+UZxXCuGxHID0lh77UlK0 qAioDafrKJCEFbjynGwdSzLccEtqWswQZlFNNDCooWnhcBrTKYcWGT6EI0e9VT7Dn/ ZXQWvbzVu9mTTn/ataEGCJ0h6SE9u+Fr+LGX3/n4= 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.9 714/757] scsi: qla2xxx: Warn if done() or free() are called on an already freed srb Date: Tue, 27 Oct 2020 14:56:04 +0100 Message-Id: <20201027135523.991075987@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135450.497324313@linuxfoundation.org> References: <20201027135450.497324313@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 0bd04a62af836..8d4b651e14422 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 861dc522723ce..2aa6f81f87c43 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