Patch "ext4: check if in-inode xattr is corrupted in ext4_expand_extra_isize_ea()" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ext4: check if in-inode xattr is corrupted in ext4_expand_extra_isize_ea()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ext4-check-if-in-inode-xattr-is-corrupted-in-ext4_expand_extra_isize_ea.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
9e92f48c34eb2b9af9d12f892e2fe1fce5e8ce35Mon Sep 17 00:00:00 2001
From: Theodore Ts'o <[email protected]>
Date: Tue, 22 Mar 2016 16:13:15 -0400
Subject: ext4: check if in-inode xattr is corrupted in ext4_expand_extra_isize_ea()
From: Theodore Ts'o <[email protected]>
commit 9e92f48c34eb2b9af9d12f892e2fe1fce5e8ce35 upstream.
We aren't checking to see if the in-inode extended attribute is corrupted before we try to expand the inode's extra isize fields.
This can lead to potential crashes caused by the BUG_ON() check in ext4_xattr_shift_entries().
--- fs/ext4/xattr.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-)
fs/ext4/xattr.c +28 -4
@@ -233,6 +233,27 @@ ext4_xattr_check_block(struct inode *inoreturn error; } +static int +__xattr_check_inode (struct inode *inode,struct ext4_xattr_ibody_header *header, +void *end,const char *function,unsigned int line) +{ +struct ext4_xattr_entry *entry =IFIRST (header); +int error = -EFSCORRUPTED ; + +if (((void *) header >= end) || + (header->h_magic !=le32_to_cpu (EXT4_XATTR_MAGIC ))) + goto errout; + error =ext4_xattr_check_names (entry, end, entry); +errout: +if (error) +__ext4_error_inode (inode, function, line,0 , +"corrupted in-inode xattr" ); +return error; +} + +#define xattr_check_inode (inode, header, end) \ + __xattr_check_inode((inode), (header), (end), __func__, __LINE__) +static inline int ext4_xattr_check_entry (struct ext4_xattr_entry *entry,size_t size) {
@@ -344,7 +365,7 @@ ext4_xattr_ibody_get(struct inode *inode header =IHDR (inode, raw_inode); entry =IFIRST (header); end = (void *)raw_inode +EXT4_SB (inode->i_sb)->s_inode_size; - error =ext4_xattr_check_names (entry, end, entry); + error =xattr_check_inode (inode, header, end);if (error) goto cleanup; error = ext4_xattr_find_entry(&entry, name_index, name,
@@ -475,7 +496,7 @@ ext4_xattr_ibody_list(struct dentry *den raw_inode =ext4_raw_inode (&iloc); header =IHDR (inode, raw_inode); end = (void *)raw_inode +EXT4_SB (inode->i_sb)->s_inode_size; - error =ext4_xattr_check_names (IFIRST (header), end,IFIRST (header)); + error =xattr_check_inode (inode, header, end);if (error) goto cleanup; error = ext4_xattr_list_entries(dentry, IFIRST(header),
@@ -991,8 +1012,7 @@ int ext4_xattr_ibody_find(struct inode * is->s.here = is->s.first; is->s.end = (void *)raw_inode +EXT4_SB (inode->i_sb)->s_inode_size;if (ext4_test_inode_state (inode,EXT4_STATE_XATTR )) { - error =ext4_xattr_check_names (IFIRST (header), is->s.end, -IFIRST (header)); + error =xattr_check_inode (inode, header, is->s.end);if (error)return error;/* Find the named attribute. */
@@ -1293,6 +1313,10 @@ retry: last = entry; total_ino =sizeof (struct ext4_xattr_ibody_header ); + error =xattr_check_inode (inode, header, end); +if (error) + goto cleanup; + free =ext4_xattr_free_space (last, &min_offs, base, &total_ino);if (free >= isize_diff) { entry =IFIRST (header);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/ext4-check-if-in-inode-xattr-is-corrupted-in-ext4_expand_extra_isize_ea.patch