Skip to content

RFC fs: Remove usage of broken nls_utf8 and drop it

Pali Rohár linux-cifs linux-fsdevel lkml oe-kbuild-all 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 RFC Latest20 patches 31 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/20fat: Fix iocharset=utf8 mount optionfs/fat/Kconfig fs/fat/dir.c fs/fat/fat.h +2 more+59 -494 replies
2/20hfsplus: Add iocharset= mount option as alias for nls=fs/hfsplus/options.c+6 -13 replies
3/20udf: Fix iocharset=utf8 mount optionfs/udf/super.c fs/udf/udf_sb.h fs/udf/unicode.c+21 -355 replies
4/20isofs: joliet: Fix iocharset=utf8 mount optionfs/isofs/inode.c fs/isofs/isofs.h fs/isofs/joliet.c+14 -181 reply
5/20ntfs: Undeprecate iocharset= mount optionfs/ntfs/inode.c fs/ntfs/super.c fs/ntfs/unistr.c+7 -116 replies
6/20ntfs: Fix error processing when load_nls() failsfs/ntfs/super.c+5 -130 replies
7/20befs: Fix printing iocharset= mount optionfs/befs/linuxvfs.c+1 -10 replies
8/20befs: Rename enum value Opt_charset to Opt_iocharset to match mount optionfs/befs/linuxvfs.c+3 -30 replies
9/20befs: Fix error processing when load_nls() failsfs/befs/linuxvfs.c+2 -30 replies
10/20befs: Allow to use native UTF-8 modefs/befs/linuxvfs.c+8 -30 replies
11/20hfs: Explicitly set hsb->nls_disk when hsb->nls_io is setfs/hfs/super.c fs/hfs/trans.c+45 -245 replies
12/20hfs: Do not use broken utf8 NLS table for iocharset=utf8 mount optionfs/hfs/super.c fs/hfs/trans.c+42 -152 replies
13/20hfsplus: Do not use broken utf8 NLS table for iocharset=utf8 mount optionfs/hfsplus/dir.c fs/hfsplus/options.c fs/hfsplus/super.c +3 more+62 -312 replies
14/20jfs: Remove custom iso8859-1 implementationfs/jfs/jfs_unicode.c fs/jfs/super.c+20 -230 replies
15/20jfs: Fix buffer overflow in jfs_strfromUCS_le() functionfs/jfs/jfs_dtree.c fs/jfs/jfs_unicode.c fs/jfs/jfs_unicode.h+14 -70 replies
16/20jfs: Do not use broken utf8 NLS table for iocharset=utf8 mount optionfs/jfs/jfs_unicode.c fs/jfs/super.c+30 -110 replies
17/20ntfs: Do not use broken utf8 NLS table for iocharset=utf8 mount optionfs/ntfs/dir.c fs/ntfs/inode.c fs/ntfs/super.c +1 more+56 -230 replies
18/20cifs: Do not use broken utf8 NLS table for iocharset=utf8 mount optionfs/cifs/cifs_unicode.c fs/cifs/cifs_unicode.h fs/cifs/cifsfs.c +3 more+124 -580 replies
19/20cifs: Remove usage of load_nls_default() callsfs/cifs/cifssmb.c fs/cifs/dfs_cache.c fs/cifs/smb2pdu.c+14 -350 replies
20/20nls: Drop broken nls_utf8 modulefs/nls/Kconfig fs/nls/Makefile fs/nls/nls_utf8.c+0 -770 replies

Reviews trailers per patch

2 of 20 patches have a Reviewed-by or Acked-by.

PatchJan Kara
1/20
2/20
3/20R-b
4/20R-b
5/20
6/20
7/20
8/20
9/20
10/20
11/20
12/20
13/20
14/20
15/20
16/20
17/20
18/20
19/20
20/20

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [RFC PATCH 00/20] fs: Remove usage of broken nls_utf8 and drop it

Module nls_utf8 is broken in several ways. It does not support (full) UTF-8, despite its name. It cannot handle 4-byte UTF-8 sequences and tolower/toupper table is not implemented at all. Which means that it is not suitable for usage in case-insensitive filesystems or UTF-16 filesystems (because of e.g. missing UTF-16 surrogate pairs processing).

This is RFC patch series which unify and fix iocharset=utf8 mount option in all fs drivers and converts all remaining fs drivers to use utf8s_to_utf16s(), utf16s_to_utf8s(), utf8_to_utf32(), utf32_to_utf8 functions for implementing UTF-8 support instead of nls_utf8.

So at the end it allows to completely drop this broken nls_utf8 module.

For more details look at email thread where was discussed fs unification:
https://lore.kernel.org/linux-fsdevel/20200102211855.gg62r7jshp742d6i@pali/t/#u

This patch series is mostly untested and presented as RFC. Please let me know what do you think about it and if is the correct way how to fix broken UTF-8 support in fs drivers. As explained in above email thread I think it does not make sense to try fixing whole NLS framework and it is easier to just drop this nls_utf8 module.

Note: this patch series does not address UTF-8 fat case-sensitivity issue:
https://lore.kernel.org/linux-fsdevel/20200119221455.bac7dc55g56q2l4r@pali/

Pali Rohár (20):
fat: Fix iocharset=utf8 mount option
hfsplus: Add iocharset= mount option as alias for nls=
udf: Fix iocharset=utf8 mount option
isofs: joliet: Fix iocharset=utf8 mount option
ntfs: Undeprecate iocharset= mount option
ntfs: Fix error processing when load_nls() fails
befs: Fix printing iocharset= mount option
befs: Rename enum value Opt_charset to Opt_iocharset to match mount
option
befs: Fix error processing when load_nls() fails
befs: Allow to use native UTF-8 mode
hfs: Explicitly set hsb->nls_disk when hsb->nls_io is set
hfs: Do not use broken utf8 NLS table for iocharset=utf8 mount option
hfsplus: Do not use broken utf8 NLS table for iocharset=utf8 mount
option
jfs: Remove custom iso8859-1 implementation
jfs: Fix buffer overflow in jfs_strfromUCS_le() function
jfs: Do not use broken utf8 NLS table for iocharset=utf8 mount option
ntfs: Do not use broken utf8 NLS table for iocharset=utf8 mount option
cifs: Do not use broken utf8 NLS table for iocharset=utf8 mount option
cifs: Remove usage of load_nls_default() calls
nls: Drop broken nls_utf8 module

 fs/befs/linuxvfs.c          |  22 ++++---
 fs/cifs/cifs_unicode.c      | 128 +++++++++++++++++++++++-------------
 fs/cifs/cifs_unicode.h      |   2 +-
 fs/cifs/cifsfs.c            |   2 +
 fs/cifs/cifssmb.c           |   8 +--
 fs/cifs/connect.c           |   8 ++-
 fs/cifs/dfs_cache.c         |  24 +++----
 fs/cifs/dir.c               |  28 ++++++--
 fs/cifs/smb2pdu.c           |  17 ++---
 fs/cifs/winucase.c          |  14 ++--
 fs/fat/Kconfig              |  15 -----
 fs/fat/dir.c                |  17 ++---
 fs/fat/fat.h                |  22 +++++++
 fs/fat/inode.c              |  28 ++++----
 fs/fat/namei_vfat.c         |  26 ++++++--
 fs/hfs/super.c              |  62 ++++++++++++++---
 fs/hfs/trans.c              |  62 +++++++++--------
 fs/hfsplus/dir.c            |   6 +-
 fs/hfsplus/options.c        |  39 ++++++-----
 fs/hfsplus/super.c          |   7 +-
 fs/hfsplus/unicode.c        |  31 ++++++++-
 fs/hfsplus/xattr.c          |  14 ++--
 fs/hfsplus/xattr_security.c |   3 +-
 fs/isofs/inode.c            |  27 ++++----
 fs/isofs/isofs.h            |   1 -
 fs/isofs/joliet.c           |   4 +-
 fs/jfs/jfs_dtree.c          |  13 +++-
 fs/jfs/jfs_unicode.c        |  35 +++++-----
 fs/jfs/jfs_unicode.h        |   2 +-
 fs/jfs/super.c              |  29 ++++++--
 fs/nls/Kconfig              |   9 ---
 fs/nls/Makefile             |   1 -
 fs/nls/nls_utf8.c           |  67 -------------------
 fs/ntfs/dir.c               |   6 +-
 fs/ntfs/inode.c             |   5 +-
 fs/ntfs/super.c             |  60 ++++++++---------
 fs/ntfs/unistr.c            |  28 +++++++-
 fs/udf/super.c              |  50 ++++++--------
 fs/udf/udf_sb.h             |   2 -
 fs/udf/unicode.c            |   4 +-
 40 files changed, 510 insertions(+), 418 deletions(-)
 delete mode 100644 fs/nls/nls_utf8.c
Signature · 1 line
2.20.1