ext4: avoid running out of journal credits when appending to an inline file
Use a separate journal transaction if it turns out that we need to convert an inline file to use an data block. Otherwise we could end up failing due to not having journal credits. This addresses CVE-2018-10883. https://bugzilla.kernel.org/show_bug.cgi?id=200071 Signed-off-by: Theodore Ts'o <tytso@mit.edu> Cc: stable@kernel.org
This commit is contained in:
@@ -2212,23 +2212,8 @@ int ext4_xattr_ibody_inline_set(handle_t *handle, struct inode *inode,
|
||||
if (EXT4_I(inode)->i_extra_isize == 0)
|
||||
return -ENOSPC;
|
||||
error = ext4_xattr_set_entry(i, s, handle, inode, false /* is_block */);
|
||||
if (error) {
|
||||
if (error == -ENOSPC &&
|
||||
ext4_has_inline_data(inode)) {
|
||||
error = ext4_try_to_evict_inline_data(handle, inode,
|
||||
EXT4_XATTR_LEN(strlen(i->name) +
|
||||
EXT4_XATTR_SIZE(i->value_len)));
|
||||
if (error)
|
||||
return error;
|
||||
error = ext4_xattr_ibody_find(inode, i, is);
|
||||
if (error)
|
||||
return error;
|
||||
error = ext4_xattr_set_entry(i, s, handle, inode,
|
||||
false /* is_block */);
|
||||
}
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
if (error)
|
||||
return error;
|
||||
header = IHDR(inode, ext4_raw_inode(&is->iloc));
|
||||
if (!IS_LAST_ENTRY(s->first)) {
|
||||
header->h_magic = cpu_to_le32(EXT4_XATTR_MAGIC);
|
||||
|
Reference in New Issue
Block a user