Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp177306rdg; Tue, 10 Oct 2023 07:24:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEn7SSvsHCH4UrlQgd26rqZuu9dWARvgL1jfm2aaGz7Ikv1OGIjLvp0g++58P1XoQIhWIMV X-Received: by 2002:a05:6a20:970c:b0:163:2dc7:d077 with SMTP id hr12-20020a056a20970c00b001632dc7d077mr14088094pzc.55.1696947884683; Tue, 10 Oct 2023 07:24:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696947884; cv=none; d=google.com; s=arc-20160816; b=Ku4HW1ZQzoBdv/KfBSE6I34vY1m9tQEcRcQye/+mdtc2GZeOTpCeO8jIBEAf6WE7yh zJz4aiZcVDbFR+IHV/ejN010mLUrsQ5XQHpcEEq29qYdVhOX3jvDR51U4Yp6jt5Xw5HR TU81gZzHmgz2thQaF62shFjnAwfFgC138GrZAvUPMfdiZ/Fn8cUK3a4YdoX9f5C9Lf4I RXd+MuTtHA12Lx6Vwo8paHROYdIuawZv9w6wXo1xE9zAab1V+aQ44224vOrilwCc2KTa HPEbQSm0UZgBTdCMNioqCsxhgVOQrv5thOk5LHfGcS2enOgIsu/IHvut+am6W53hFgP1 3w0g== 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 :message-id:date:subject:cc:to:from; bh=ueQq6/5YwP68N9CzP9HFLc4ydQhD4WeLaETtqbhuros=; fh=XjbPFQV1q33pSyHU0DJViPof6LxQPkAWDXnCrlkcrhg=; b=hMUe9VNxYp279wVskSU/QVNZSle2R1UtBmZGEz7PSv5xaS0nYTzLfSAj+svS4S/5W+ xPg+y4fZa0zbcqju+enWHJfu6eA6JEPNJ503TuBJvJglQWBAJQQ505xrlAqJ6/uWDX2c 7W3KUtDxxvelH8WQBuQsPJJgZFv7iDbkbyMPsv/Jc8A5kCKvC9gRxAMVUd+iD0mFdlII FF/+Z3mk1tNC3HoPl+vSJVGcSmX0gp8cb0hsXu0emdOxRJsEMohTzGEAhJysVCOD19kZ ts1G9calhDs6tG3PxEPXBqHmI2hTpM0MCumsticpxeEil1T+a6GTN4DnFMp4P0f9vzbq 5GzQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:1 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from morse.vger.email (morse.vger.email. [2620:137:e000::3:1]) by mx.google.com with ESMTPS id m20-20020a637114000000b00577448019cbsi12550019pgc.841.2023.10.10.07.24.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Oct 2023 07:24:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:1 as permitted sender) client-ip=2620:137:e000::3:1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:1 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id 7E2DF8113415; Tue, 10 Oct 2023 07:24:42 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232865AbjJJOYf (ORCPT + 99 others); Tue, 10 Oct 2023 10:24:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41570 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232618AbjJJOYe (ORCPT ); Tue, 10 Oct 2023 10:24:34 -0400 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D3D4A91 for ; Tue, 10 Oct 2023 07:24:31 -0700 (PDT) Received: from dggpemm500009.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4S4dMW62kfztTGK; Tue, 10 Oct 2023 22:19:51 +0800 (CST) Received: from huawei.com (10.175.127.227) by dggpemm500009.china.huawei.com (7.185.36.225) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.31; Tue, 10 Oct 2023 22:24:27 +0800 From: ZhaoLong Wang To: , , CC: , , , , , Subject: [PATCH RFC] ubi: gluebi: Fix NULL pointer dereference caused by ftl notifier Date: Tue, 10 Oct 2023 22:29:25 +0800 Message-ID: <20231010142925.545238-1-wangzhaolong1@huawei.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.175.127.227] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpemm500009.china.huawei.com (7.185.36.225) X-CFilter-Loop: Reflected X-Spam-Status: No, score=2.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Tue, 10 Oct 2023 07:24:42 -0700 (PDT) X-Spam-Level: ** If both flt.ko and gluebi.ko are loaded, the notiier of ftl triggers NULL pointer dereference when trying to visit ‘gluebi->desc’ in gluebi_read(). ubi_gluebi_init ubi_register_volume_notifier ubi_enumerate_volumes ubi_notify_all gluebi_notify nb->notifier_call() gluebi_create mtd_device_register mtd_device_parse_register add_mtd_device blktrans_notify_add not->add() ftl_add_mtd tr->add_mtd() scan_header mtd_read mtd_read mtd_read_oob gluebi_read mtd->read() gluebi->desc - NULL Detailed reproduction information available at the link[1], In the normal case, obtain gluebi->desc in the gluebi_get_device(), and accesses gluebi->desc in the gluebi_read(). However, gluebi_get_device() is not executed in advance in the ftl_add_mtd() process, which leads to null pointer dereference. This patch assumes that the gluebi module is not designed to work with the ftl module. In this case, the patch only needs to prevent the ftl notifier operation. Add some correctness check for gluebi->desc in gluebi_read/write/erase(), If the pointer is invalid, the -EINVAL is returned. Link: https://bugzilla.kernel.org/show_bug.cgi?id=217992 [1] Signed-off-by: ZhaoLong Wang --- drivers/mtd/ubi/gluebi.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/mtd/ubi/gluebi.c b/drivers/mtd/ubi/gluebi.c index 1b980d15d9fb..189ecc0eacd1 100644 --- a/drivers/mtd/ubi/gluebi.c +++ b/drivers/mtd/ubi/gluebi.c @@ -157,6 +157,9 @@ static int gluebi_read(struct mtd_info *mtd, loff_t from, size_t len, struct gluebi_device *gluebi; gluebi = container_of(mtd, struct gluebi_device, mtd); + if (IS_ERR_OR_NULL(gluebi->desc)) + return -EINVAL; + lnum = div_u64_rem(from, mtd->erasesize, &offs); bytes_left = len; while (bytes_left) { @@ -197,6 +200,9 @@ static int gluebi_write(struct mtd_info *mtd, loff_t to, size_t len, struct gluebi_device *gluebi; gluebi = container_of(mtd, struct gluebi_device, mtd); + if (IS_ERR_OR_NULL(gluebi->desc)) + return -EINVAL; + lnum = div_u64_rem(to, mtd->erasesize, &offs); if (len % mtd->writesize || offs % mtd->writesize) @@ -242,6 +248,8 @@ static int gluebi_erase(struct mtd_info *mtd, struct erase_info *instr) lnum = mtd_div_by_eb(instr->addr, mtd); count = mtd_div_by_eb(instr->len, mtd); gluebi = container_of(mtd, struct gluebi_device, mtd); + if (IS_ERR_OR_NULL(gluebi->desc)) + return -EINVAL; for (i = 0; i < count - 1; i++) { err = ubi_leb_unmap(gluebi->desc, lnum + i); -- 2.31.1