Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp2345999ybz; Thu, 23 Apr 2020 16:27:16 -0700 (PDT) X-Google-Smtp-Source: APiQypLJ0bziff6ZxjajDU3THgc+rNpY0AAnPWnesKEryue1nVL+TZkNT3zF54Xz+M4ronrR9ggU X-Received: by 2002:a17:906:3296:: with SMTP id 22mr4928335ejw.195.1587684436089; Thu, 23 Apr 2020 16:27:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587684436; cv=none; d=google.com; s=arc-20160816; b=04KwTRzX7ncSgCralrOwT5VMvyQVjS1bskON9FiNJb4xLAfkghDt2CKRyz9yZ32RDU iLRAu+Ap8SJzWC39Tu0AtTN5MD9Y6wk6o7eP3+pcbIHQuksfNSQ+c3OjK3TutXtrruG2 5KBxYKeNmsXhzC5ZAxGw6Neh4YJh7hNIlm4WfvMo11ISonlJDq6vnEYAOkNsCv3JwB7t EwaZh2Cqk0BUi3O3oo/8UCT94q7sWCtHw7lP7Mw+cAF6naESK/mKAbQYtQZfYX45JWj/ JSu2Ca4iS6Lmj0rGQzNOj5u7oebYUYbiDZtagKAO8ZHfqPM8ghvpyLCmWAmYbNB234C9 8tYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=6+VSFuTEiQ8jv5FJxaBQYT/JHki+e8lfTerp4QdRpGU=; b=XMHOGaefZTFLIGePR0Dg23lO/MGWVIn++3AafEKwkorf/mUBeB/wRK8BLkmLSjQ8aZ LyGkRjPzcD+XVrek2nTlmbEvEg5GlweO6dnoylzPvfk57A5fGmurzNJwBfsUCB2jOH7m 4D+iLl9AJBtYydibk3va/ir4fmcl5FYn4nTcxa2GqCHCCNFfhBHto37DiyuOmrK0Anqp RSSHbguDVNMYIHq/24Uyii8c2JyU0pb3zOKK1JQuPnJebI+PdGlH3JrFNhhXthy0VsNs velPFE8YFXOYMGvwn868qz0o5ODqnMmPCEYAW1sRPPgYoLpKwFVWM4lurGhEWU+3z9O+ OE/g== 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 cc27si2318810edb.544.2020.04.23.16.26.52; Thu, 23 Apr 2020 16:27:16 -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 S1728935AbgDWXXa (ORCPT + 99 others); Thu, 23 Apr 2020 19:23:30 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:48442 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728176AbgDWXGb (ORCPT ); Thu, 23 Apr 2020 19:06:31 -0400 Received: from [192.168.4.242] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1jRkvL-0004bZ-2G; Fri, 24 Apr 2020 00:06:27 +0100 Received: from ben by deadeye with local (Exim 4.93) (envelope-from ) id 1jRkvJ-00E6iM-Os; Fri, 24 Apr 2020 00:06:25 +0100 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, Denis Kirjanov , "Su Yue" , "Ben Hutchings" , "Qu Wenruo" , "David Sterba" , "Greg Kroah-Hartman" Date: Fri, 24 Apr 2020 00:04:40 +0100 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 053/245] btrfs: tree-checker: Check level for leaves and nodes In-Reply-To: X-SA-Exim-Connect-IP: 192.168.4.242 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.83-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Qu Wenruo commit f556faa46eb4e96d0d0772e74ecf66781e132f72 upstream. Although we have tree level check at tree read runtime, it's completely based on its parent level. We still need to do accurate level check to avoid invalid tree blocks sneak into kernel space. The check itself is simple, for leaf its level should always be 0. For nodes its level should be in range [1, BTRFS_MAX_LEVEL - 1]. Signed-off-by: Qu Wenruo Reviewed-by: Su Yue Reviewed-by: David Sterba Signed-off-by: David Sterba [bwh: Backported to 4.4: - Pass root instead of fs_info to generic_err() - Adjust context] Signed-off-by: Ben Hutchings Signed-off-by: Greg Kroah-Hartman Signed-off-by: Ben Hutchings --- fs/btrfs/tree-checker.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) --- a/fs/btrfs/tree-checker.c +++ b/fs/btrfs/tree-checker.c @@ -447,6 +447,13 @@ static int check_leaf(struct btrfs_root u32 nritems = btrfs_header_nritems(leaf); int slot; + if (btrfs_header_level(leaf) != 0) { + generic_err(root, leaf, 0, + "invalid level for leaf, have %d expect 0", + btrfs_header_level(leaf)); + return -EUCLEAN; + } + /* * Extent buffers from a relocation tree have a owner field that * corresponds to the subvolume tree they are based on. So just from an @@ -589,9 +596,16 @@ int btrfs_check_node(struct btrfs_root * unsigned long nr = btrfs_header_nritems(node); struct btrfs_key key, next_key; int slot; + int level = btrfs_header_level(node); u64 bytenr; int ret = 0; + if (level <= 0 || level >= BTRFS_MAX_LEVEL) { + generic_err(root, node, 0, + "invalid level for node, have %d expect [1, %d]", + level, BTRFS_MAX_LEVEL - 1); + return -EUCLEAN; + } if (nr == 0 || nr > BTRFS_NODEPTRS_PER_BLOCK(root)) { btrfs_crit(root->fs_info, "corrupt node: root=%llu block=%llu, nritems too %s, have %lu expect range [1,%zu]",