Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp4646217ybl; Wed, 22 Jan 2020 01:59:35 -0800 (PST) X-Google-Smtp-Source: APXvYqy3QeMIehcYYctbdwQq99amZYNfUyQT+9AlsOO/yXvzQ6aEssINQoR6MwOLRhPBDMsjsoNU X-Received: by 2002:aca:5745:: with SMTP id l66mr6407515oib.3.1579687175204; Wed, 22 Jan 2020 01:59:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579687175; cv=none; d=google.com; s=arc-20160816; b=zZBVzsabzC3fHigQSyoG195zfBP8gjQuypUTQxBQBAmG9hRcxM1rNQEoMH1TEKX1u2 ZTSyefK/f9RuS7V4JPlpwu4bFNuh6SNzpYu/ia+qtmL4mvL8Y7Na9txfzTP4wBxqU7i2 QeSe4Ts3wSOAUz6sTEjtTYjwHYH/fVjdLNmqElnZOpVXJZ29HdQkn9Gc0GBV+jLfwAdD Nv3e0aJy7nKkSZx6bvB0D+ABLNOsv4ZU2zkm27aqXOLAOuGXblV7tku9USpxHi7i0o86 pYfMPrCuc3q5PskVwbl+5enWnDnvzduQZLTacTI9XF2hm7JrkNoY2ncxdnZR3jPZHEJZ 9slQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=VhsZQJ6vt/EFiRjQ44kkv1VWeW4yS1/pbs7uld1JeMM=; b=XZwwfRT6Ub+qu5O07v7QkerJs5/zvs4YqTTWvQtAvFridK+glRu9DecEZnLp76LX9t uJeuif8FGusM/uGM0n5shRc8gzj/F1H+RXqU2TJfPfuYQMZkAF+uJTsc8fsplcrRBcLW XOzu/14eeGT4MedTwtLUB+mFt9tar1IkirMPg9o5VuQI2nPIpMMb5SWiWvVMLvpU2WTT nH2xE1FUCKogIEjTv6YRC+1nZWZh/Wtsh9rA1y4z9+J2ZlVhbqzYMt+l6H+U124P8WAM 14hE1u4EFpAfeMSAN1XiJU0xucJyzDjBAMJzUQy1URTIKh04T3yMFB2fCw2YUqb1VIDT 0rQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=W7+UoK+B; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w2si1469826otk.126.2020.01.22.01.59.22; Wed, 22 Jan 2020 01:59:35 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=W7+UoK+B; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729340AbgAVJap (ORCPT + 99 others); Wed, 22 Jan 2020 04:30:45 -0500 Received: from mail.kernel.org ([198.145.29.99]:42294 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729305AbgAVJam (ORCPT ); Wed, 22 Jan 2020 04:30:42 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B840424673; Wed, 22 Jan 2020 09:30:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579685441; bh=qYZJsJ9crxng36NhHFiECchhuNmziVLa8IomZpd1pGU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=W7+UoK+B3hATWwSN9uuFgQtLJ0NACJLeQuGzzs2X7pWLrZl6gzvai1PR2KXIQqAx5 Rp5/U/+WiRpdBYFh028t7ef2QEhmcw74yPwRnYJ0eikobSv8fq5r7+4oyq3tCNxpZ+ qok9iiufIuWbHp1Agqbaur/iZd5K9w2UKExT8xLQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, syzbot+f8d6f8386ceacdbfff57@syzkaller.appspotmail.com, syzbot+33d7ea72e47de3bdf4e1@syzkaller.appspotmail.com, syzbot+44b6763edfc17144296f@syzkaller.appspotmail.com, Theodore Tso , Ben Hutchings Subject: [PATCH 4.4 16/76] ext4: add more paranoia checking in ext4_expand_extra_isize handling Date: Wed, 22 Jan 2020 10:28:32 +0100 Message-Id: <20200122092753.191585972@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200122092751.587775548@linuxfoundation.org> References: <20200122092751.587775548@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Theodore Ts'o commit 4ea99936a1630f51fc3a2d61a58ec4a1c4b7d55a upstream. It's possible to specify a non-zero s_want_extra_isize via debugging option, and this can cause bad things(tm) to happen when using a file system with an inode size of 128 bytes. Add better checking when the file system is mounted, as well as when we are actually doing the trying to do the inode expansion. Link: https://lore.kernel.org/r/20191110121510.GH23325@mit.edu Reported-by: syzbot+f8d6f8386ceacdbfff57@syzkaller.appspotmail.com Reported-by: syzbot+33d7ea72e47de3bdf4e1@syzkaller.appspotmail.com Reported-by: syzbot+44b6763edfc17144296f@syzkaller.appspotmail.com Signed-off-by: Theodore Ts'o [bwh: Backported to 4.4: adjust context] Signed-off-by: Ben Hutchings Signed-off-by: Greg Kroah-Hartman --- fs/ext4/inode.c | 15 +++++++++++++++ fs/ext4/super.c | 20 ++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5189,10 +5189,25 @@ static int ext4_expand_extra_isize(struc { struct ext4_inode *raw_inode; struct ext4_xattr_ibody_header *header; + unsigned int inode_size = EXT4_INODE_SIZE(inode->i_sb); + struct ext4_inode_info *ei = EXT4_I(inode); if (EXT4_I(inode)->i_extra_isize >= new_extra_isize) return 0; + /* this was checked at iget time, but double check for good measure */ + if ((EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize > inode_size) || + (ei->i_extra_isize & 3)) { + EXT4_ERROR_INODE(inode, "bad extra_isize %u (inode size %u)", + ei->i_extra_isize, + EXT4_INODE_SIZE(inode->i_sb)); + return -EFSCORRUPTED; + } + if ((new_extra_isize < ei->i_extra_isize) || + (new_extra_isize < 4) || + (new_extra_isize > inode_size - EXT4_GOOD_OLD_INODE_SIZE)) + return -EINVAL; /* Should never happen */ + raw_inode = ext4_raw_inode(&iloc); header = IHDR(inode, raw_inode); --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -3173,11 +3173,15 @@ static void ext4_clamp_want_extra_isize( { struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_super_block *es = sbi->s_es; + unsigned def_extra_isize = sizeof(struct ext4_inode) - + EXT4_GOOD_OLD_INODE_SIZE; - /* determine the minimum size of new large inodes, if present */ - if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) { - sbi->s_want_extra_isize = sizeof(struct ext4_inode) - - EXT4_GOOD_OLD_INODE_SIZE; + if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) { + sbi->s_want_extra_isize = 0; + return; + } + if (sbi->s_want_extra_isize < 4) { + sbi->s_want_extra_isize = def_extra_isize; if (ext4_has_feature_extra_isize(sb)) { if (sbi->s_want_extra_isize < le16_to_cpu(es->s_want_extra_isize)) @@ -3190,10 +3194,10 @@ static void ext4_clamp_want_extra_isize( } } /* Check if enough inode space is available */ - if (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > - sbi->s_inode_size) { - sbi->s_want_extra_isize = sizeof(struct ext4_inode) - - EXT4_GOOD_OLD_INODE_SIZE; + if ((sbi->s_want_extra_isize > sbi->s_inode_size) || + (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > + sbi->s_inode_size)) { + sbi->s_want_extra_isize = def_extra_isize; ext4_msg(sb, KERN_INFO, "required extra inode space not available"); }