Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3424912pxf; Mon, 22 Mar 2021 06:15:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzy06TD5Kpv6nnApUu5rUwm1n7066ExD4Q33nczuOz1V8wrlT1d5RQuODqoFCCVs2bfmdi7 X-Received: by 2002:a17:906:7806:: with SMTP id u6mr18219005ejm.130.1616418914638; Mon, 22 Mar 2021 06:15:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616418914; cv=none; d=google.com; s=arc-20160816; b=ulvqh8/GvRYi5uKPjSXtMkv7QkgxHA7ViG9nEtOIM8hu9CeHo9FPVJXVXD4rFVRovs 6oDIIiYlju5L3GH45WQLSnEhCy6xse6Q/bZOwursUGtd0A7UtZ3GYPsffFsbKj1HEyO+ cUTnstPu8HwupMLxdqtSFCdMos8L+7d7sLx96VniOCHU8SJIcEC6Tc2JSip/X2+n8fDt Dknjk3b5DQSW2TT65Sh3p+Fzx1MBhLmozLcn/sj/MRtRW6e71xsJHCaWVT+nVUzLoJjL Oj+uSacSU5vc8jW7fZF7I1HCRwAp+Bm8JCsb9Lu3WS3w/mJqotuj4AuRsY2+IcH1ZPpI xnZA== 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=KPxoa8ctVbHCEa5cYT+V2/iytV9rTEWhuWFEJRbtjDo=; b=ETyCOAxADa2W181tcGNdMGlFHL6A9ByU7jfx46Blo0tbvIHy+8iJgoJBIAyFPddBFM o60kACY5PP7SM0rgACKhcCi0Fm+5s4Q0od5ffVvSRQ1Cznr0+BY1e28lYvdJEJi8009N xD+5FHNcpTWmajJn/z4rWA3yZOroDQ0DAFA2KBqFksr+17Cwh4Dph+VkdPc+3JBHuYcZ CxamOwjE9RSB5kFIkq17lfp1YPZJtTD/c6BsYlMyCjIIFKB/gnUMsFV3OA1mIFM3bE99 N/8uDaUmjFGs31KyoOeh6jpTpm7/zlIaxQoRAceSNVQSwpwGCEwLcLWpzLS1Avim39o2 OqNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=kxyrUl2b; 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 t16si11550458edc.448.2021.03.22.06.14.47; Mon, 22 Mar 2021 06:15:14 -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=kxyrUl2b; 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 S231512AbhCVNNp (ORCPT + 99 others); Mon, 22 Mar 2021 09:13:45 -0400 Received: from mail.kernel.org ([198.145.29.99]:47778 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231584AbhCVMvn (ORCPT ); Mon, 22 Mar 2021 08:51:43 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 13FCD61A2A; Mon, 22 Mar 2021 12:46:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1616417169; bh=/MmVq5Ogx833lFW8IvgYNzD3k9TDCJnlbClvnqfVyXA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kxyrUl2bseLU1ENVvbsA89/YYDV2Yi/iCug64zbU73MRJ+kXR50TUOnN8n9A3gwq/ PQNpwGvE9j+A4xfKwtSOdbTvrGeKKtPHhX3oTOSb0QWfO9QhDXNLQyNrKY8CzqhXHs MIFN8qecXEXQw0ypvdmQ95IwFGOJ6D97gpEiiFWU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lukas Czerner , Jan Kara , Theodore Tso Subject: [PATCH 4.4 02/14] ext4: dont allow overlapping system zones Date: Mon, 22 Mar 2021 13:28:56 +0100 Message-Id: <20210322121919.280296991@linuxfoundation.org> X-Mailer: git-send-email 2.31.0 In-Reply-To: <20210322121919.202392464@linuxfoundation.org> References: <20210322121919.202392464@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: Jan Kara commit bf9a379d0980e7413d94cb18dac73db2bfc5f470 upstream. Currently, add_system_zone() just silently merges two added system zones that overlap. However the overlap should not happen and it generally suggests that some unrelated metadata overlap which indicates the fs is corrupted. We should have caught such problems earlier (e.g. in ext4_check_descriptors()) but add this check as another line of defense. In later patch we also use this for stricter checking of journal inode extent tree. Reviewed-by: Lukas Czerner Signed-off-by: Jan Kara Link: https://lore.kernel.org/r/20200728130437.7804-3-jack@suse.cz Signed-off-by: Theodore Ts'o Signed-off-by: Greg Kroah-Hartman --- fs/ext4/block_validity.c | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) --- a/fs/ext4/block_validity.c +++ b/fs/ext4/block_validity.c @@ -57,7 +57,7 @@ static int add_system_zone(struct ext4_s ext4_fsblk_t start_blk, unsigned int count) { - struct ext4_system_zone *new_entry = NULL, *entry; + struct ext4_system_zone *new_entry, *entry; struct rb_node **n = &sbi->system_blks.rb_node, *node; struct rb_node *parent = NULL, *new_node = NULL; @@ -68,30 +68,20 @@ static int add_system_zone(struct ext4_s n = &(*n)->rb_left; else if (start_blk >= (entry->start_blk + entry->count)) n = &(*n)->rb_right; - else { - if (start_blk + count > (entry->start_blk + - entry->count)) - entry->count = (start_blk + count - - entry->start_blk); - new_node = *n; - new_entry = rb_entry(new_node, struct ext4_system_zone, - node); - break; - } + else /* Unexpected overlap of system zones. */ + return -EFSCORRUPTED; } - if (!new_entry) { - new_entry = kmem_cache_alloc(ext4_system_zone_cachep, - GFP_KERNEL); - if (!new_entry) - return -ENOMEM; - new_entry->start_blk = start_blk; - new_entry->count = count; - new_node = &new_entry->node; + new_entry = kmem_cache_alloc(ext4_system_zone_cachep, + GFP_KERNEL); + if (!new_entry) + return -ENOMEM; + new_entry->start_blk = start_blk; + new_entry->count = count; + new_node = &new_entry->node; - rb_link_node(new_node, parent, n); - rb_insert_color(new_node, &sbi->system_blks); - } + rb_link_node(new_node, parent, n); + rb_insert_color(new_node, &sbi->system_blks); /* Can we merge to the left? */ node = rb_prev(new_node);