Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1927953ybl; Tue, 3 Dec 2019 15:09:30 -0800 (PST) X-Google-Smtp-Source: APXvYqxPKsl9nfPphb6oUCeRJIkoPg2W9dhvgPYkWifDfpAsnRpLTlNQSO5QyRVHSM1GV/6E85Tu X-Received: by 2002:a05:6830:1e4f:: with SMTP id e15mr270118otj.41.1575414570603; Tue, 03 Dec 2019 15:09:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1575414570; cv=none; d=google.com; s=arc-20160816; b=vd93VzuXb4SRYpEcRkwHyV5MKrHaemVOoHNWp6Wem+OaT2rLWXc3tnM6S9t86QBv6j zSJf3gbYnIpqec7T4rxlrtuz3fAhTzR/s4Fau6+IzZDTScuyk3R+bjKhP7nPlQQ7E1W8 vmMR+zTwoHiIgvOuJl0hpLBTdWI5DoMoFhx4cCvg1iLy3E7voj3FrzaqbdMU/LooO45v zaOCz9MXOQnYy0QGCyZuHb9sarzq1iz8MlUgMJ3rHH8yDzHR4y9p5bS3WYApgiAIvEU6 HCyY0In3sG+ln5q3EervY2xS5j6WZ69x1jfs9xsnp+RaMoZ7cV1TiSreSwDVBwvDQ9K8 8tzQ== 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=ZblrZpPQuA6pP40vNEJn+iTLc1rI+Y7MqR/6v0UIPkI=; b=S3fAS4kjDpZbk4/k7sj31yGdQEXjM6KvfpAjTZszvgWVe5tABltHcfGzGiDfBSConV 63mfUJ3Ri5LhxuQtKdfYIQAY2uVZ0UebiKAOtwr8XTmePlsdslv41R94nJTz+pdASHsj J8J/cFPvG3vTltTtv/T/FYDXi9W1+VPKGM2mBMK2DM6Dk0KUfDCIExVCkBGNuynUIMy+ qTq8kOG3YTX/iVOrYdHIluZaAre3HWJYMLFXfq3ALdu8+QDDWJF6l8BG7GJDlyvYUqEz NpCDbJtkkCYOW8bAqgblEcv3qW5vGxzljWlP7rklwFSmEL7BhFvki90tMlYVjVFI3y8h 8AfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=PYMBlZqD; 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 f188si2294182oia.70.2019.12.03.15.09.18; Tue, 03 Dec 2019 15:09:30 -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=PYMBlZqD; 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 S1728839AbfLCXIo (ORCPT + 99 others); Tue, 3 Dec 2019 18:08:44 -0500 Received: from mail.kernel.org ([198.145.29.99]:33810 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729026AbfLCWpS (ORCPT ); Tue, 3 Dec 2019 17:45:18 -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 6314D20803; Tue, 3 Dec 2019 22:45:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1575413117; bh=7TJDgx84nCACAaNLo8pxn2QH6mbY7YKuaYRX/WxnJX0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PYMBlZqDVW9GzvNO18JOiihTFFP5824AQLvdIvemc9EwKURFeoFQuz2NpmM+NvMp+ a36sTNEaEM8Do7LCbx3rI4rmI0mQUErEiV+PDcFj4qyouygVc7RuYkTyYUYXd/dx7n hQ+uETR2JzJS2sZxeSiN2QgD6GmT/EzoGoBMBj28= 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 , stable@kernel.org Subject: [PATCH 5.3 132/135] ext4: add more paranoia checking in ext4_expand_extra_isize handling Date: Tue, 3 Dec 2019 23:36:12 +0100 Message-Id: <20191203213045.748648671@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191203213005.828543156@linuxfoundation.org> References: <20191203213005.828543156@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 Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman --- fs/ext4/inode.c | 15 +++++++++++++++ fs/ext4/super.c | 21 ++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5942,8 +5942,23 @@ static int __ext4_expand_extra_isize(str { 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); int error; + /* 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 @@ -3544,12 +3544,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 == 0) { - 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)) @@ -3562,10 +3565,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"); }