@ -244,20 +244,9 @@ errout:
# 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 )
{
size_t value_size = le32_to_cpu ( entry - > e_value_size ) ;
if ( entry - > e_value_block ! = 0 | | value_size > size | |
le16_to_cpu ( entry - > e_value_offs ) + value_size > size )
return - EFSCORRUPTED ;
return 0 ;
}
static int
ext4_xattr_find_entry ( struct ext4_xattr_entry * * pentry , int name_index ,
const char * name , size_t size , int sorted )
const char * name , int sorted )
{
struct ext4_xattr_entry * entry ;
size_t name_len ;
@ -277,8 +266,6 @@ ext4_xattr_find_entry(struct ext4_xattr_entry **pentry, int name_index,
break ;
}
* pentry = entry ;
if ( ! cmp & & ext4_xattr_check_entry ( entry , size ) )
return - EFSCORRUPTED ;
return cmp ? - ENODATA : 0 ;
}
@ -306,7 +293,6 @@ ext4_xattr_block_get(struct inode *inode, int name_index, const char *name,
ea_bdebug ( bh , " b_count=%d, refcount=%d " ,
atomic_read ( & ( bh - > b_count ) ) , le32_to_cpu ( BHDR ( bh ) - > h_refcount ) ) ;
if ( ext4_xattr_check_block ( inode , bh ) ) {
bad_block :
EXT4_ERROR_INODE ( inode , " bad block %llu " ,
EXT4_I ( inode ) - > i_file_acl ) ;
error = - EFSCORRUPTED ;
@ -314,9 +300,7 @@ bad_block:
}
ext4_xattr_cache_insert ( ext4_mb_cache , bh ) ;
entry = BFIRST ( bh ) ;
error = ext4_xattr_find_entry ( & entry , name_index , name , bh - > b_size , 1 ) ;
if ( error = = - EFSCORRUPTED )
goto bad_block ;
error = ext4_xattr_find_entry ( & entry , name_index , name , 1 ) ;
if ( error )
goto cleanup ;
size = le32_to_cpu ( entry - > e_value_size ) ;
@ -353,13 +337,12 @@ ext4_xattr_ibody_get(struct inode *inode, int name_index, const char *name,
return error ;
raw_inode = ext4_raw_inode ( & iloc ) ;
header = IHDR ( inode , raw_inode ) ;
entry = IFIRST ( header ) ;
end = ( void * ) raw_inode + EXT4_SB ( inode - > i_sb ) - > s_inode_size ;
error = xattr_check_inode ( inode , header , end ) ;
if ( error )
goto cleanup ;
error = ext4_xattr_find_entry ( & entry , name_index , name ,
end - ( void * ) entry , 0 ) ;
entry = IFIRST ( header ) ;
error = ext4_xattr_find_entry ( & entry , name_index , name , 0 ) ;
if ( error )
goto cleanup ;
size = le32_to_cpu ( entry - > e_value_size ) ;
@ -793,7 +776,7 @@ ext4_xattr_block_find(struct inode *inode, struct ext4_xattr_info *i,
bs - > s . end = bs - > bh - > b_data + bs - > bh - > b_size ;
bs - > s . here = bs - > s . first ;
error = ext4_xattr_find_entry ( & bs - > s . here , i - > name_index ,
i - > name , bs - > bh - > b_size , 1 ) ;
i - > name , 1 ) ;
if ( error & & error ! = - ENODATA )
goto cleanup ;
bs - > s . not_found = error ;
@ -1065,8 +1048,7 @@ int ext4_xattr_ibody_find(struct inode *inode, struct ext4_xattr_info *i,
return error ;
/* Find the named attribute. */
error = ext4_xattr_find_entry ( & is - > s . here , i - > name_index ,
i - > name , is - > s . end -
( void * ) is - > s . base , 0 ) ;
i - > name , 0 ) ;
if ( error & & error ! = - ENODATA )
return error ;
is - > s . not_found = error ;