Skip to content

Commit 5f920d5

Browse files
jankaratytso
authored andcommitted
ext4: verify fast symlink length
Verify fast symlink length stored in inode->i_size matches the string stored in the inode to avoid surprises from corrupted filesystems. Reported-by: [email protected] Tested-by: [email protected] Fixes: bae8047 ("ext4: use inode_set_cached_link()") Suggested-by: Darrick J. Wong <[email protected]> Signed-off-by: Jan Kara <[email protected]> Reviewed-by: Baokun Li <[email protected]> Reviewed-by: Darrick J. Wong <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent c8e008b commit 5f920d5

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

fs/ext4/inode.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5029,8 +5029,16 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
50295029
inode->i_op = &ext4_encrypted_symlink_inode_operations;
50305030
} else if (ext4_inode_is_fast_symlink(inode)) {
50315031
inode->i_op = &ext4_fast_symlink_inode_operations;
5032-
nd_terminate_link(ei->i_data, inode->i_size,
5033-
sizeof(ei->i_data) - 1);
5032+
if (inode->i_size == 0 ||
5033+
inode->i_size >= sizeof(ei->i_data) ||
5034+
strnlen((char *)ei->i_data, inode->i_size + 1) !=
5035+
inode->i_size) {
5036+
ext4_error_inode(inode, function, line, 0,
5037+
"invalid fast symlink length %llu",
5038+
(unsigned long long)inode->i_size);
5039+
ret = -EFSCORRUPTED;
5040+
goto bad_inode;
5041+
}
50345042
inode_set_cached_link(inode, (char *)ei->i_data,
50355043
inode->i_size);
50365044
} else {

0 commit comments

Comments
 (0)