Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1084921pxk; Mon, 31 Aug 2020 09:20:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/kQu3yK1oCoITnw+76vADcfd1fXS+FjgRKR8JRtmYfmU0QhxlX56Mi4kyjAGrN3FShCoE X-Received: by 2002:aa7:c7da:: with SMTP id o26mr1948449eds.261.1598890845543; Mon, 31 Aug 2020 09:20:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598890845; cv=none; d=google.com; s=arc-20160816; b=CKAsbrEWQnNFyGPW+wJmZGzXAylWkdekiHCsViTetisFvmYRDxfniSGhpDrA18INnu HA99QiOmLWwvW7mI1Zw5YE3pQQASnXt7m3gXlgZ0fUclsPvkTCjcMlEEuzlR8tFuOfDG JQ/WJWh1tEnp/yti/d7jioQ3b5FFzlyM+lY7dOWtvbUcBx0j8NDkNINlMzBaBpdLEZcH 5XsP7jK2oWhtu+oAGttZxnF2PTFeRNyfhQM3UurAucMVSFXZFavWy1BmQZOfHfeztQrb Xatj2dZdwZjdE9K4M0rVOXPya7b5imYdvylfhOj+4blMC20cNu4y9XwrzaFGwXa+CcBi BmMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=nIuVfEG9LLmeM58JYkL66oiwJSIThZJBeeVM0ZNdoBY=; b=vsUDe8LsPF73Wq2OR8mLl9zr1pzTAToMTt3epXkBqV2JWATHx702v4qpVTL99ppRL2 yheWBCX2AMh7n4yheZbHj4XS3yppmrNp2wojnTdf4bRhr+GKWaR47YDCTgibaOSZ3v2f b9JDtSqtwToTWZUTfVOD3aavBE9xM3S/+lWDAIUoC/iLIhlzZvh/JxEnKLCl1xynFUYM hSI20jVt0kCVKFqU34ieMLDMZrRdfDl2/079mVR2yetpO293uufBLgH++cImvPXPmhUr 90JvOkyB1vcuY7Lm52gS95vaMVaO/aduX85fmX+O/qIOo60N9clUXH0lduNJw44OEVuD 7Fhg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y19si5491602edt.53.2020.08.31.09.20.21; Mon, 31 Aug 2020 09:20:45 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728680AbgHaQT2 (ORCPT + 99 others); Mon, 31 Aug 2020 12:19:28 -0400 Received: from mx2.suse.de ([195.135.220.15]:45884 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728394AbgHaQTW (ORCPT ); Mon, 31 Aug 2020 12:19:22 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 8234DAC6F; Mon, 31 Aug 2020 16:19:19 +0000 (UTC) From: Daniel Wagner To: linux-scsi@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Nilesh Javali , Martin Wilck , Daniel Wagner Subject: [PATCH v2 1/4] qla2xxx: Warn if done() or free() are called on an already freed srb Date: Mon, 31 Aug 2020 18:18:51 +0200 Message-Id: <20200831161854.70879-2-dwagner@suse.de> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200831161854.70879-1-dwagner@suse.de> References: <20200831161854.70879-1-dwagner@suse.de> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. By explicitly resetting the callbacks to NULL, we workaround the memory corruption. An extensive search didn't bring any lights on the real problem. The initial idea 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. Signed-off-by: Daniel Wagner --- 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 57a2d76aa691..9e9360a4aeb5 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 object\n"); +} + +void qla2xxx_rel_free_warning(srb_t *sp) +{ + WARN_ONCE(1, "Calling free() of an already freed srb object\n"); +} + /* Asynchronous Login/Logout Routines -------------------------------------- */ unsigned long diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h index 861dc522723c..2aa6f81f87c4 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.16.4