• Vasant Karasulli's avatar
    exfat: allow access to paths with trailing dots · 9ec784bf
    Vasant Karasulli authored
     The Linux kernel exfat driver currently unconditionally strips
     trailing periods '.' from path components. This isdone intentionally,
     loosely following Windows behaviour and specifications
     which state:
    
      #exFAT
      The concatenated file name has the same set of illegal characters as
      other FAT-based file systems (see Table 31).
    
      #FAT
      ...
      Leading and trailing spaces in a long name are ignored.
      Leading and embedded periods are allowed in a name and are stored in
      the long name. Trailing periods are ignored.
    
    Note: Leading and trailing space ' ' characters are currently retained
    by Linux kernel exfat, in conflict with the above specification.
    On Windows 10, trailing and leading space ' ' characters are stripped
    from the filenames.
    Some implementations, such as fuse-exfat, don't perform path trailer
    removal. When mounting images which contain trailing-dot paths, these
    paths are unreachable, e.g.:
    
      + mount.exfat-fuse /dev/zram0 /mnt/test/
      FUSE exfat 1.3.0
      + cd /mnt/test/
      + touch fuse_created_dots... '  fuse_created_spaces  '
      + ls -l
      total 0
      -rwxrwxrwx 1 root 0 0 Aug 18 09:45 '  fuse_created_spaces  '
      -rwxrwxrwx 1 root 0 0 Aug 18 09:45  fuse_created_dots...
      + cd /
      + umount /mnt/test/
      + mount -t exfat /dev/zram0 /mnt/test
      + cd /mnt/test
      + ls -l
      ls: cannot access 'fuse_created_dots...': No such file or directory
      total 0
      -rwxr-xr-x 1 root 0 0 Aug 18 09:45 '  fuse_created_spaces  '
      -????????? ? ?    ? ?            ?  fuse_created_dots...
      + touch kexfat_created_dots... '  kexfat_created_spaces  '
      + ls -l
      ls: cannot access 'fuse_created_dots...': No such file or directory
      total 0
      -rwxr-xr-x 1 root 0 0 Aug 18 09:45 '  fuse_created_spaces  '
      -rwxr-xr-x 1 root 0 0 Aug 18 09:45 '  kexfat_created_spaces  '
      -????????? ? ?    ? ?            ?  fuse_created_dots...
      -rwxr-xr-x 1 root 0 0 Aug 18 09:45  kexfat_created_dots
      + cd /
      + umount /mnt/test/
    
    This commit adds "keep_last_dots" mount option that controls whether or
    not trailing periods '.' are stripped
    from path components during file lookup or file creation.
    This mount option can be used to access
    paths with trailing periods and disallow creating files with names with
    trailing periods. E.g. continuing from the previous example:
    
      + mount -t exfat -o keep_last_dots /dev/zram0 /mnt/test
      + cd /mnt/test
      + ls -l
      total 0
      -rwxr-xr-x 1 root 0 0 Aug 18 10:32 '  fuse_created_spaces  '
      -rwxr-xr-x 1 root 0 0 Aug 18 10:32 '  kexfat_created_spaces  '
      -rwxr-xr-x 1 root 0 0 Aug 18 10:32  fuse_created_dots...
      -rwxr-xr-x 1 root 0 0 Aug 18 10:32  kexfat_created_dots
    
      + echo > kexfat_created_dots_again...
      sh: kexfat_created_dots_again...: Invalid argument
    
    Link: https://bugzilla.suse.com/show_bug.cgi?id=1188964
    Link: https://lore.kernel.org/linux-fsdevel/003b01d755e4$31fb0d80$95f12880$
    @samsung.com/
    Link: https://docs.microsoft.com/en-us/windows/win32/fileio/exfat-specificationSuggested-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarVasant Karasulli <vkarasulli@suse.de>
    Co-developed-by: default avatarDavid Disseldorp <ddiss@suse.de>
    Signed-off-by: default avatarDavid Disseldorp <ddiss@suse.de>
    Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
    9ec784bf
exfat_fs.h 17.1 KB