Received: by 2002:a05:6a10:eb17:0:0:0:0 with SMTP id hx23csp445417pxb; Wed, 8 Sep 2021 05:01:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+8Nr0gbCBDzdrRBe54LH0YdCtDDUub1o2PVtix3LbrWm0JmZhUvvNEXywsHfrF525r2aq X-Received: by 2002:a92:d102:: with SMTP id a2mr2470763ilb.162.1631102489825; Wed, 08 Sep 2021 05:01:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631102489; cv=none; d=google.com; s=arc-20160816; b=eKkqqleMd2qzjy0Ppzubcwyl1mKJjTtuQgtg5VYHnWVFYVc23YkIOzTxPW5jOR5tpK pU/EWWxdTJWV+AT4AkzsR9aeaZtKT+jj402dPyyJMqIxChLncAsf/cR/WFTOgjONSdJ3 G2yf+OlPv9qmKEAzXoy6YjVS5WGwsPwYJpPSFyBSgX7rNBv3ZWcBpBQp1/pMRL6W3ivM s8AdGjaz7JgClLoA3dNwS7Pdz3FvGJuMrWpbtUS7gRLpn1oSEUqezwIi9ksl7mP96ltn J9G2Lnywq1XgYda/ynJaokR/0S3c5DtvKzwu4lQ4BES8wjR2ca9JkVNWDo1g/FKh2Ntd Wwxg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=nIFJcl0VKfxsTkKyVHYNVFC4i/cKZNzef8QxwfjDF00=; b=DMWbPpWn+Er8Qs/N2Dc8VsWAdXQs4CphGKYBjhs8N6NaE030SJJZ7SRhf1R1hC+hwI 939210j8LxlZDydka1pL5vFyRmO0xIRWJAvV737lmCt1V79+QXU7x4dxuParOW1ShrA8 XZA1UNbe0tPYKcW5Pzufh+bWpqN/qiMStF6g0EXDbF/tSG2VK1J+g2Vi/vg/rffduryO Nj+hXIuXspfWkIzu1XARMSYfIb87tkNGXBjM7xzyDVndAq2jddyJs+wISeiN5eo8cwam bjuxDv3iOwrC/rFG18MHGWOcZqjufigtqh6t0tbkyBPSo2Z7xpXnoRIuqGfPao47NhWy F+vA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l8si1930431ilt.110.2021.09.08.05.01.16; Wed, 08 Sep 2021 05:01:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4-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-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349209AbhIHMAI (ORCPT + 99 others); Wed, 8 Sep 2021 08:00:08 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:9406 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1351517AbhIHMAH (ORCPT ); Wed, 8 Sep 2021 08:00:07 -0400 Received: from dggeme752-chm.china.huawei.com (unknown [172.30.72.53]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4H4LCf0RMSz8xt2; Wed, 8 Sep 2021 19:54:38 +0800 (CST) Received: from huawei.com (10.175.127.227) by dggeme752-chm.china.huawei.com (10.3.19.98) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.8; Wed, 8 Sep 2021 19:58:58 +0800 From: Zhang Yi To: CC: , , , , Subject: [RFC PATCH 1/3] ext4: check for out-of-order index extents in ext4_valid_extent_entries() Date: Wed, 8 Sep 2021 20:08:48 +0800 Message-ID: <20210908120850.4012324-2-yi.zhang@huawei.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210908120850.4012324-1-yi.zhang@huawei.com> References: <20210908120850.4012324-1-yi.zhang@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.127.227] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggeme752-chm.china.huawei.com (10.3.19.98) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org After commit 5946d089379a ("ext4: check for overlapping extents in ext4_valid_extent_entries()"), we can check out the overlapping extent entry in leaf extent blocks. But the out-of-order extent entry in index extent blocks could also trigger bad things if the filesystem is inconsistent. So this patch add a check to figure out the out-of-order index extents and return error. Signed-off-by: Zhang Yi --- fs/ext4/extents.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index c0de30f25185..4bb1153c01b3 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -357,6 +357,9 @@ static int ext4_valid_extent_entries(struct inode *inode, ext4_fsblk_t *pblk, int depth) { unsigned short entries; + ext4_lblk_t lblock = 0; + ext4_lblk_t prev = 0; + if (eh->eh_entries == 0) return 1; @@ -365,31 +368,35 @@ static int ext4_valid_extent_entries(struct inode *inode, if (depth == 0) { /* leaf entries */ struct ext4_extent *ext = EXT_FIRST_EXTENT(eh); - ext4_lblk_t lblock = 0; - ext4_lblk_t prev = 0; - int len = 0; while (entries) { if (!ext4_valid_extent(inode, ext)) return 0; /* Check for overlapping extents */ lblock = le32_to_cpu(ext->ee_block); - len = ext4_ext_get_actual_len(ext); if ((lblock <= prev) && prev) { *pblk = ext4_ext_pblock(ext); return 0; } + prev = lblock + ext4_ext_get_actual_len(ext) - 1; ext++; entries--; - prev = lblock + len - 1; } } else { struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh); while (entries) { if (!ext4_valid_extent_idx(inode, ext_idx)) return 0; + + /* Check for overlapping index extents */ + lblock = le32_to_cpu(ext_idx->ei_block); + if ((lblock <= prev) && prev) { + *pblk = ext4_idx_pblock(ext_idx); + return 0; + } ext_idx++; entries--; + prev = lblock; } } return 1; -- 2.31.1