LINUX.ORG.RU
ФорумTalks

В ядре Linux поломали и пофиксили юникод в именах файлов

 , , ,


0

3

Собственно, сабж: https://www.phoronix.com/news/Linux-Reverts-Special-Char-Uni .

Linus Torvalds took to reverting some code tonight within the mainline Linux kernel that inadvertently had broken support having filenames with ❤️ and other special Unicode characters in filenames when on file-systems with case-folding (optional case insensitive file/folder name) support.

Linus Torvalds commented in the revert: «It turns out that we can't do this, because while the old behavior of ignoring ignorable code points was most definitely wrong, we have case-folding filesystems with on-disk hash values with that wrong behavior.

So now you can't look up those names, because they hash to something different.

Of course, it's also entirely possible that in the meantime people have created *new* files with the new („more correct“) case folding logic, and reverting will just make other things break.

The correct solution is to not do case folding in filesystems, but sadly, people seem to never really understand that. People still see it as a feature, not a bug.»

★★★★★
Ответ на: комментарий от firkax

Юникод сломать элементарно без регистронезависимости, без зависимости от кодировок и без всего остального. Просто взять и в одном месте приводить имена к NFC форме, в другой к NFD, в третьей оставить ввод пользователя без нормализации как есть.

shimshimshim
()
Ответ на: комментарий от shimshimshim

Что за NFC NFD? Ядро ничего никуда не приводит. Имя файла это массив байт, заканчивающийся нулевым байтом. Всякие кодировки появляются уже в юзерспейсе в прогах.

firkax ★★★★★
()
Ответ на: комментарий от wandrien

Я лично давно их использую, в первую очередь для сортировки.

shimshimshim
()
Ответ на: комментарий от firkax

Я не про ядро, я вообще. А про NFC/NFD - буквы юникода с диакритикой и не только можно представить как одним так и двумя символами. Оба варианта правильны, оба варианта используются юзерспейсовым софтом. В бинарном виде они будут отличаться и наивный поиск со сравнением по байтам работать не будет.

shimshimshim
()
Ответ на: комментарий от shimshimshim

Тема то про ядро.

В бинарном виде они будут отличаться и наивный поиск со сравнением по байтам работать не будет.

Да, они будут отличаться и это действительно разные имена. Путать их друг с другом не надо, несмотря на то что в юникодной кодировке они выглядят внешне одинаково. Если допустим есть две байтовые последовательности A и B, которые в юникоде обозначают одно и то же, и ты хочешь открыть файл A, но его нет а есть файл B - то правильным ответом будет именно «нет такого файла».

Это примерно из той же серии что кирилицу/латиницу в буквах а,с,е менять - внешне одно и то же, но байтовое представление разное, а именно оно важно.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

это действительно разные имена

Это одинаковые имена, несмотря на то что в бинарном виде они выглядят по-разному. В корректно поддерживающей уникод программе они будут считаться одинаковыми. И например нормально написанные программы считают хэши паролей так, чтобы они были одинаковыми независимо от NFC/NFD на входе.

Это вообще не повод для спора.

shimshimshim
()
Ответ на: комментарий от shimshimshim

Корректно поддерживающая файловую систему программа не будет сувать туда юникодные штуки. Юникод только для отображения на экране, на файловые операции он не должен влиять никак.

firkax ★★★★★
()
Ответ на: комментарий от firkax

А на файловые операции это и не влияет. Подумаешь битики не совпадают при том что имена-то одинаковые. Влиять это начинает когда кто-то потом начинает делать поиск по этим битикам.

А по поводу casefold линус прав. Смена регистра в юникоде не коммутативна, ß -> SS -> ss как самый известный пример.

shimshimshim
()
Ответ на: комментарий от shimshimshim

Ты не в ту сторону смотришь. Имя файла это именно биты и есть. Всякие юникоды это их опциональная интерпретация (а может быть и другая - кодировок много), и они в норме могут применяться только в тех рамках, которые не нарушают корректную работу битового представления.

firkax ★★★★★
()
Ответ на: комментарий от dataman

Лишний, да. Это видимо как раз кусок багнутого casefold-а. Либо костыль-адаптер ко всяким чужеродным фс типа ntfs-а.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Имя файла само по себе мало кому интересно. По именам файлов делаются операции вроде поиска и сортировки, которые должны работать корректно независимо от битового представления самих имен и от того, что вводит пользователь. Каким способом это решается в ядре Линукс мне лично не интересно, но в том что это решено сомнений нет, и вариантов решения всего два - либо при всех операциях с файлом от создания до удаления сразу приводить ввод пользователя к заранее выбранной стандартной форме, либо потом все это делать медленно и печально каждый раз при любом обращении к файлу по имени.

shimshimshim
()
Последнее исправление: shimshimshim (всего исправлений: 1)

Непонятно, почему написали только про f2fs. А как же ext4?

casefold
              This ext4 feature provides file system level character
              encoding support for directories with the casefold (+F)
              flag enabled.  This feature is name-preserving on the
              disk, but it allows applications to lookup for a file in
              the file system using an encoding equivalent version of
              the file name.
dataman ★★★★★
()
Ответ на: комментарий от shimshimshim

Сортировка делается уже в интерфейсе в соответствии с выбранной в том же интерфейсе локалью. То есть если ты в двух окна откроешь файловый менеджер с разными локалями то и сортировать он будет по-разному. Но к файловой системе это отношения не особо имеет. Это визуальное оформление.

firkax ★★★★★
()
Ответ на: комментарий от dmitry237

Как-нибудь типа

export LC_ALL=ru_RU.[название кодировки]

в sh-подобной оболочке.

pandrey ★★
()
Ответ на: комментарий от firkax

Сортировка делается уже в интерфейсе

Обратите внимание, что в сабжевом багрепорте ругался просто ls.

cd Picture
ls -alh
ls: cannot access '❤️': No such file or directory
total 8
Файл был и файла не стало. Ибо доступ к ФС осуществляется через ядро. Ядро обрабатывает запросы с именами файлов. И если оно внезапно начинает обрабатывать юникодные имена файлов не так как надо, то это и называется «в ядре Linux поломали юникод в именах файлов».

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Я в который раз уточню, что сломался не доступ к файлам вообще, а именно ненужная багофича casefold. На монтированиях где её не было всех указанных проблем не случилось.

firkax ★★★★★
()
Ответ на: комментарий от dmitry237

Это каким «пони» нужно быть по жизни?

А как вы будете расширения исходникам на Mojo задавать? :-D

atrus ★★★★★
()
Ответ на: комментарий от firkax

сломался не доступ к файлам вообще, а именно ненужная багофича casefold. На монтированиях где её не было всех указанных проблем не случилось.

А где она была поломался доступ к определённым файлам вообще. Любой баг проявляется при определённых обстоятельствах, а не вообще везде. Тем не менее, они считаются багами и их фиксят. Так и здесь.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Да я не отрицал что баг есть. Но он не в файловой системе вообще а именно по причине того что в неё засунули этот ужасный костыль, весь смысл существования которого - совместимость с виндузятным софтом где такая же логика по умолчанию.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Но он не в файловой системе вообще

Он в ядре. В той его части, где происходит обработка имён файлов. «case folding in filesystems» является частью этой подсистемы ядра. Просто её можно не задействовать, да. А можно и задействовать.

saahriktu ★★★★★
() автор топика

Ля, у меня другая хрень, после включения компа, минуты три висит, органиченное соединене, и интернета нет, потом проходит...

petyanamlt ★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)