summaryrefslogtreecommitdiffstats
path: root/fs/ext4/inline.c
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2018-05-22 16:15:24 -0400
committerTheodore Ts'o <tytso@mit.edu>2018-05-22 16:15:24 -0400
commit117166efb1ee8f13c38f9e96b258f16d4923f888 (patch)
treea0b934b5cbeb7d1b42982796a19cf93e28f05fa5 /fs/ext4/inline.c
parentf06925c7394236d769c788940c9a7b85dbe4c40c (diff)
ext4: do not allow external inodes for inline data
The inline data feature was implemented before we added support for external inodes for xattrs. It makes no sense to support that combination, but the problem is that there are a number of extended attribute checks that are skipped if e_value_inum is non-zero. Unfortunately, the inline data code is completely e_value_inum unaware, and attempts to interpret the xattr fields as if it were an inline xattr --- at which point, Hilarty Ensues. This addresses CVE-2018-11412. https://bugzilla.kernel.org/show_bug.cgi?id=199803 Reported-by: Jann Horn <jannh@google.com> Reviewed-by: Andreas Dilger <adilger@dilger.ca> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Fixes: e50e5129f384 ("ext4: xattr-in-inode support") Cc: stable@kernel.org
Diffstat (limited to 'fs/ext4/inline.c')
-rw-r--r--fs/ext4/inline.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index 70cf4c7b268a..44b4fcdc3755 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -144,6 +144,12 @@ int ext4_find_inline_data_nolock(struct inode *inode)
144 goto out; 144 goto out;
145 145
146 if (!is.s.not_found) { 146 if (!is.s.not_found) {
147 if (is.s.here->e_value_inum) {
148 EXT4_ERROR_INODE(inode, "inline data xattr refers "
149 "to an external xattr inode");
150 error = -EFSCORRUPTED;
151 goto out;
152 }
147 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - 153 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here -
148 (void *)ext4_raw_inode(&is.iloc)); 154 (void *)ext4_raw_inode(&is.iloc));
149 EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + 155 EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE +