ACK: [TRUSTY][SRU][PATCH 1/1] ext4: handle symlink properly with inline_data

Chris J Arges chris.j.arges at canonical.com
Fri Aug 8 13:45:27 UTC 2014



On 08/08/2014 04:31 AM, Luis Henriques wrote:
> From: Zheng Liu <wenqing.lz at taobao.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1349020
> 
> This commit tries to fix a bug that we can't read symlink properly with
> inline data feature when the length of symlink is greater than 60 bytes
> but less than extra space.
> 
> The key issue is in ext4_inode_is_fast_symlink() that it doesn't check
> whether or not an inode has inline data.  When the user creates a new
> symlink, an inode will be allocated with MAY_INLINE_DATA flag.  Then
> symlink will be stored in ->i_block and extended attribute space.  In
> the mean time, this inode is with inline data flag.  After remounting
> it, ext4_inode_is_fast_symlink() function thinks that this inode is a
> fast symlink so that the data in ->i_block is copied to the user, and
> the data in extra space is trimmed.  In fact this inode should be as a
> normal symlink.
> 
> The following script can hit this bug.
> 
>   #!/bin/bash
> 
>   cd ${MNT}
>   filename=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
>   rm -rf test
>   mkdir test
>   cd test
>   echo "hello" >$filename
>   ln -s $filename symlinkfile
>   cd
>   sudo umount /mnt/sda1
>   sudo mount -t ext4 /dev/sda1 /mnt/sda1
>   readlink /mnt/sda1/test/symlinkfile
> 
> After applying this patch, it will break the assumption in e2fsck
> because the original implementation doesn't want to support symlink
> with inline data.
> 
> Reported-by: "Darrick J. Wong" <darrick.wong at oracle.com>
> Reported-by: Ian Nartowicz <claws at nartowicz.co.uk>
> Cc: Ian Nartowicz <claws at nartowicz.co.uk>
> Cc: Tao Ma <tm at tao.ma>
> Cc: "Darrick J. Wong" <darrick.wong at oracle.com>
> Cc: Andreas Dilger <adilger.kernel at dilger.ca>
> Signed-off-by: Zheng Liu <wenqing.lz at taobao.com>
> Signed-off-by: Theodore Ts'o <tytso at mit.edu>
> (cherry picked from commit bd9db175dde14b606265e0d37e8319d96fe1a58f)
> Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
> ---
>  fs/ext4/inode.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index 4fafd0949441..658f30361b82 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -148,6 +148,9 @@ static int ext4_inode_is_fast_symlink(struct inode *inode)
>  	int ea_blocks = EXT4_I(inode)->i_file_acl ?
>  		(inode->i_sb->s_blocksize >> 9) : 0;
>  
> +	if (ext4_has_inline_data(inode))
> +		return 0;
> +
>  	return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
>  }
>  
> 




More information about the kernel-team mailing list