• Zheng Liu's avatar
    ext4: handle symlink properly with inline_data · bd9db175
    Zheng Liu authored
    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: default avatar"Darrick J. Wong" <darrick.wong@oracle.com>
    Reported-by: default avatarIan Nartowicz <claws@nartowicz.co.uk>
    Cc: Ian Nartowicz <claws@nartowicz.co.uk>
    Cc: Tao Ma <tm@tao.ma>
    Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
    Cc: Andreas Dilger <adilger.kernel@dilger.ca>
    Signed-off-by: default avatarZheng Liu <wenqing.lz@taobao.com>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    bd9db175
inode.c 151 KB