diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index d3dfc51a43c5..82869266cdc7 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -58,6 +58,10 @@ static int get_max_inline_xattr_value_size(struct inode *inode, header = IHDR(inode, raw_inode); entry = IFIRST(header); + WARN_ON(ext4_xattr_check_inode(inode, header, + (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size)); + + /* Compute min_offs. */ for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry)) { if (!entry->e_value_inum && entry->e_value_size) { diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index dfc2e223bd10..d5ea058f63a1 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -315,6 +315,17 @@ __xattr_check_inode(struct inode *inode, struct ext4_xattr_ibody_header *header, #define xattr_check_inode(inode, header, end) \ __xattr_check_inode((inode), (header), (end), __func__, __LINE__) +int ext4_xattr_check_inode(struct inode *inode, struct ext4_xattr_ibody_header *header, + void *end) +{ + int error = xattr_check_inode(inode, header, end); + + WARN_ON(error); + return error; +} + + + static int xattr_find_entry(struct inode *inode, struct ext4_xattr_entry **pentry, void *end, int name_index, const char *name, int sorted) @@ -667,6 +678,7 @@ ext4_xattr_ibody_get(struct inode *inode, int name_index, const char *name, header = IHDR(inode, raw_inode); end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size; error = xattr_check_inode(inode, header, end); + WARN_ON(error); if (error) goto cleanup; entry = IFIRST(header); diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h index 824faf0b15a8..8b6350693fdc 100644 --- a/fs/ext4/xattr.h +++ b/fs/ext4/xattr.h @@ -225,3 +225,6 @@ static inline void ext4_xattr_inode_set_class(struct inode *ea_inode) { } #endif extern int ext4_get_inode_usage(struct inode *inode, qsize_t *usage); +extern int ext4_xattr_check_inode(struct inode *inode, + struct ext4_xattr_ibody_header *header, + void *end);