Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp746925ybl; Wed, 4 Dec 2019 10:11:03 -0800 (PST) X-Google-Smtp-Source: APXvYqw9n+u0gIJLG9IVMn3qMw2B+Uc6sKlzllmEN2KzYPyEHMlteY+tOGlW2BpvFxuFkYveQ9uS X-Received: by 2002:aca:f514:: with SMTP id t20mr3795203oih.24.1575483063037; Wed, 04 Dec 2019 10:11:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1575483063; cv=none; d=google.com; s=arc-20160816; b=IG97BoCfjizKUfH6gkj9/F42c5JDnp/xnl2+/QC5xFaLUXCnz4qyWJKBnqlh2Z7YXo TwlO4k3GgGNlBN3jM+9GnqxE4fmHLGXQ6uahHejoXkv2YN3DCebfwxfBYM2ivANDcd4j fX33k8RiD4XumYy+ZQqp2lSKRjhDuFatT+c2F/94uZKVhMzodnRaccoD5EkY7Rfswg0p NNoqelAPLU740DVidBG6WxLhqYnVJlmmDGwW42ohX0b04W2agl2TcAqVLSfdh4r0Q8Pf D2b0j/77atP+tNcoJCVooSLEpMvxb9ILudb2glVsNLcQ56A1G3J+RPo9waixWEozwebS lBfA== 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=eY48ymMeXv6bZp+Dm4Gn7s0GO22TAcGTk2kMD/4OTiY=; b=D3s+PO6vjkhbevGaq070Z+XE/b8ppqvFTLcrFUTrU+dC10TwQFcJJ73neJh9h+uNJs hWcZDCc5m0B8aoejpD8mnuHEVUuOvo1ZE6ABDKFe+Burn5/ahuKvsak8jdLU6c7XHwTp xPwMrJXH1zvHE1d0e+xrxkaxIyjomq2u5UqWzjjdIIJkTzgKydgw03e0zt23nH6uU153 L/eggpnSOITpojjtYWA9S+22N/18k4+YP2yUjbUJyJ9kF1AhU5WJ3aAnWClwE+MOKCkr 882AZG9YiIAE2BxdsfKZcJPrhbLXKkxOUevdaG2vjaWuwuOxMrDBPNdyW4XD2pDOAghb KGog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qlw9oEXq; 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 h4si3658817otk.172.2019.12.04.10.10.50; Wed, 04 Dec 2019 10:11:03 -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=qlw9oEXq; 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 S1730905AbfLDSI0 (ORCPT + 99 others); Wed, 4 Dec 2019 13:08:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:59912 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730478AbfLDSIT (ORCPT ); Wed, 4 Dec 2019 13:08:19 -0500 Received: from localhost (unknown [217.68.49.72]) (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 F12CE20833; Wed, 4 Dec 2019 18:08:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1575482898; bh=vD5DbcQuHNyFqCaTV3uL3AGJnv5Np/Ak+3dxUMn/pOU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qlw9oEXqBWvp/oDs0MjWhm1xsFpGxfX6MJSWy66zq5hPtOyP4aSzhocu47mm2PW/6 BLPJUAlLs+zGtnjFXuXtAj4k2oUhTomYjDybS+Fd36OeU4jxnux2HUk1uCTBi75Q0I sIMKDZ32Q0zj8uanJ8VWtk2QF7CaoFPbCYzOGqwI= 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 4.14 178/209] ext4: add more paranoia checking in ext4_expand_extra_isize handling Date: Wed, 4 Dec 2019 18:56:30 +0100 Message-Id: <20191204175335.742169887@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191204175321.609072813@linuxfoundation.org> References: <20191204175321.609072813@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 @@ -5751,8 +5751,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 @@ -3458,12 +3458,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)) @@ -3476,10 +3479,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"); }