Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2495428pxj; Mon, 10 May 2021 04:30:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxw2QNk5A5fpJHOK1yPlKzehRRE93Q3lOrmZ1fzp5UBVh2wQxEfIXQ2TtZMI6JLJtj8aP0T X-Received: by 2002:a6b:f10a:: with SMTP id e10mr17820243iog.188.1620646209063; Mon, 10 May 2021 04:30:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620646209; cv=none; d=google.com; s=arc-20160816; b=qHbBxekWXUPxEoHCBgwTxvkbDUvf5SYhZC8CWEzO1HTNfPuh4bJES9i8qTBnf9FLF2 7X1GzmkujnIaUUHPeF2k+vUTYayTOszjB4e4Yj4U1XhF/T2SHvswfS/G8xHFxrpn+Wix 9aMlifENO1J5NJf7xzCsOp/8lcBlNndq8WFM9uxfjk4wfJi9KZJywCFpZd1aBKa70TyE o8y9c7itWES68HQ0eaFhAFQJMm5YRiogyv7zubAMw9yYEjgqJIyWFh7YBVopvvIDvw+Z sZ/D+IeJYoGKNj4rfdBIG9JDsIOFXTmEDsT9njAVQwGmgP/sKEvynpmXSb4Ax3stSUR/ dB0A== 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=6gglI7ok4wL+S0wEsA516jpBRkSUU47LKS4nJdD8kaA=; b=X7XRjI6zJLK3uROftaVcUJkws0YdnLvnIbXMnAvbk8/kBQsTMbh6qLPRICT12NbORb anH5pGzEbSLURSjnddK1tzrKjkteT7ddSD6Jf/XnZs88EqLMeQ0xCbSdc0vBi+x4ib7g +4OF52ntx5DNVG/o6wALuPhsYiIrMMqzIvJKEb+blpAa7b2VMu1ECD2wIeUYmZXCMGrI vupMTOHtVyZ7MQNeq36HkIao8xli1ggcwUbDgVmvCg9Usp5Nlx+831Hr859N5oakV4El MOFlZEOkk4hsCT/qByOdq75VbBpYKZ8JQkhXnpANT9fhQDc5Sv4FcDHGhPDP5Wvy2O0e VUPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=nJPgF7Qp; 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=pass (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 h10si16191968ioe.38.2021.05.10.04.29.55; Mon, 10 May 2021 04:30:09 -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=@linuxfoundation.org header.s=korg header.b=nJPgF7Qp; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239346AbhEJL0a (ORCPT + 99 others); Mon, 10 May 2021 07:26:30 -0400 Received: from mail.kernel.org ([198.145.29.99]:52212 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234399AbhEJK4V (ORCPT ); Mon, 10 May 2021 06:56:21 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id A316561879; Mon, 10 May 2021 10:45:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620643546; bh=EqHzrBmieLlpZtjfvTHBmpiTcbXZXdpLArps5WU30S4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nJPgF7QpfqBFfIaf8S6n4650/6WS2YGun25//Lmpf0Hw8pddNnNLaZJdJopdcpU62 ByZ1sQSpTh47beCuYVwe7tm4+FJqeEC5WLIaVGE9K5d9GwBq98Aw2tTZoXr8zkgwXd 45yd6slGKjW25otMc7aaI691oHjgkdMzAzH1wgCw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Xiang Chen , Yicong Yang , Tudor Ambarus , Michael Walle Subject: [PATCH 5.11 023/342] mtd: spi-nor: core: Fix an issue of releasing resources during read/write Date: Mon, 10 May 2021 12:16:53 +0200 Message-Id: <20210510102010.870819063@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102010.096403571@linuxfoundation.org> References: <20210510102010.096403571@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: Xiang Chen commit be94215be1ab19e5d38f50962f611c88d4bfc83a upstream. If rmmod the driver during read or write, the driver will release the resources which are used during read or write, so it is possible to refer to NULL pointer. Use the testcase "mtd_debug read /dev/mtd0 0xc00000 0x400000 dest_file & sleep 0.5;rmmod spi_hisi_sfc_v3xx.ko", the issue can be reproduced in hisi_sfc_v3xx driver. To avoid the issue, fill the interface _get_device and _put_device of mtd_info to grab the reference to the spi controller driver module, so the request of rmmod the driver is rejected before read/write is finished. Fixes: b199489d37b2 ("mtd: spi-nor: add the framework for SPI NOR") Signed-off-by: Xiang Chen Signed-off-by: Yicong Yang Signed-off-by: Tudor Ambarus Tested-by: Michael Walle Tested-by: Tudor Ambarus Reviewed-by: Michael Walle Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/1617262486-4223-1-git-send-email-yangyicong@hisilicon.com Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/spi-nor/core.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -3264,6 +3264,37 @@ static void spi_nor_resume(struct mtd_in dev_err(dev, "resume() failed\n"); } +static int spi_nor_get_device(struct mtd_info *mtd) +{ + struct mtd_info *master = mtd_get_master(mtd); + struct spi_nor *nor = mtd_to_spi_nor(master); + struct device *dev; + + if (nor->spimem) + dev = nor->spimem->spi->controller->dev.parent; + else + dev = nor->dev; + + if (!try_module_get(dev->driver->owner)) + return -ENODEV; + + return 0; +} + +static void spi_nor_put_device(struct mtd_info *mtd) +{ + struct mtd_info *master = mtd_get_master(mtd); + struct spi_nor *nor = mtd_to_spi_nor(master); + struct device *dev; + + if (nor->spimem) + dev = nor->spimem->spi->controller->dev.parent; + else + dev = nor->dev; + + module_put(dev->driver->owner); +} + void spi_nor_restore(struct spi_nor *nor) { /* restore the addressing mode */ @@ -3458,6 +3489,8 @@ int spi_nor_scan(struct spi_nor *nor, co mtd->_read = spi_nor_read; mtd->_suspend = spi_nor_suspend; mtd->_resume = spi_nor_resume; + mtd->_get_device = spi_nor_get_device; + mtd->_put_device = spi_nor_put_device; if (nor->params->locking_ops) { mtd->_lock = spi_nor_lock;