Linus Torvalds 今天分享了他对支持大小写折叠/不区分大小写的文件和文件夹的文件系统的一些经典和直截了当的智慧。
由于 Bcachefs 发现了对其实现的损坏的 case 折叠支持,现在提交到本周为 Linux 6.15 修复,Linus 在 Linux 内核邮件列表中写了一篇长文,概述了他对此类 case 折叠功能的看法。
当前的 Bcachefs 大小写折叠问题也不是 Linux 文件系统第一次出现大小写折叠问题。过去曾存在一些问题,例如表情符号和其他特殊 Unicode 字符的大小写折叠行为。

Linus Torvalds 在 LKML 上写下了他对不区分大小写的文件/文件夹的文件系统大小写折叠的感受:
“唯一需要吸取的教训是,文件系统人从来没有学习过。
不区分大小写的名称是非常错误的,你根本不应该这样做。问题不在于缺乏测试,而在于首先实施它。
然后,“试图做对”使问题复杂化,在这个过程中确实犯了可怕的错误,因为“正确”不存在,但试图使随机字节具有非常神奇的含义。
顺便说一句,反正这些测试都完全坏了。我上次看到的,他们实际上并没有测试所有真正有趣的案例 – 那些在用户领域导致安全问题的情况。
安全问题,例如“用户空间检查文件名与某些安全敏感模式不匹配”。然后,该死的文件系统最终*无论如何*都匹配了那个模式,因为不区分大小写的人*总是*会做一些事情,比如忽略非打印字符,所以现在“不区分大小写”也意味着“对其他事物也不敏感”。
有关这方面的例子,请参阅提交
5c26d2f1d3f5 (“unicode: Don’t special case ignorable code points”)
和
231825b2e1ff (“Revert ”unicode: Don’t special case ignorable code points“”)
和 cry。
提示:❤和 ❤️ 是两个 Unicode 字符,仅在可忽略的码位上有所不同。你猜怎么着?那些希望这两个文件进行相同比较的 cray-cray 无能的人也会有其他随机的 – 也许是安全敏感的 – 文件进行相同的比较,只是因为它们中有可忽略的码位。
所以现在每个检查它们没有接触特殊路径的用户模式程序基本上都很容易被愚弄去做他们明确检查不应该做的事情。不,这并不是什么不寻常或奇怪的事情。*很多* 程序正是这样做的。
该死。区分大小写是一个 BUG。事实上,文件系统的人 * 仍然 * 认为这是一个功能,我无法理解。就像他们非常尊重旧的 FAT 文件系统一样,以至于他们不得不重新创建它 – 非常糟糕。
经典的 Linus 直截了当地分享了他的技术感受。
转自 Linus Torvalds Expresses His Hatred For Case-Insensitive File-Systems – Phoronix
Linuxeden开源社区