beldmit: (Программизм)
Dmitry Belyavskiy ([personal profile] beldmit) wrote2013-09-04 09:38 am

Интересно, как это работает.

Из Changelog новой версии ядра Linux (3.11, "Linux for workgroups"):

В системные вызовы open() и openat() добавлена поддержка флага O_TMPFILE, позволяющего передать файловой системе информацию о создании временного файла, не видимого в иерархии ФС, что позволяет применить для данного типа файлов отдельные оптимизации. Создаваемые при помощи O_TMPFILE временные файлы не имеют имени, в качестве пути передаётся только директория. Создание невидимого временного файла без имени позволяет разработчикам приложений не задумываться о возможных уязвимостях, таких, как атака через символические ссылки;

В ряде мест такая возможность сильно упростит жизнь. Но до широкого распространения, боюсь, еще долго.
tobotras: (Default)

[personal profile] tobotras 2013-09-04 06:59 am (UTC)(link)
Дык, всю жизнь в юниксах было идиомой создать файл, открыть и сразу удалить. Дальше ты с ним работаешь, и файл жив только пока жив процесс, держащий файл-дескриптор. А тут просто не надо звать unlink(2), оптимизация.

[identity profile] beldmit.livejournal.com 2013-09-04 07:01 am (UTC)(link)
Но в твоем варианте возможны гонки между созданием и удалением. Или нет?
tobotras: (Default)

[personal profile] tobotras 2013-09-04 07:15 am (UTC)(link)
А в чём гонка-то? Не торопясь создал, потом не торопясь удалил, потом не торопясь работаешь с ним себе. Если тебя в неудачный момент застрелили -- ну, останется валяться нулевой длины /tmp/tmpsomething...

[identity profile] qkowlew.livejournal.com 2013-09-04 07:42 am (UTC)(link)
как будто не бывает no free inodes :-)

[identity profile] potan.livejournal.com 2013-09-04 09:13 am (UTC)(link)
В современных fs не бывает.

[identity profile] beldmit.livejournal.com 2013-09-05 10:56 am (UTC)(link)
Два процесса создали файл с одинаковым именем.
tobotras: (Default)

[personal profile] tobotras 2013-09-05 11:11 am (UTC)(link)
/tmp/tmpfile.MyApplication.$$ ? :)

[identity profile] beldmit.livejournal.com 2013-09-05 11:12 am (UTC)(link)
Не, это само собой решение. Пока у тебя не мультитред.
tobotras: (Default)

[personal profile] tobotras 2013-09-05 11:38 am (UTC)(link)
s/PID/TID/ :-)

[identity profile] qkowlew.livejournal.com 2013-09-04 07:30 am (UTC)(link)
да. Атака по ошибке в коде на этом этапе рано или поздно ведет к no free inodes

[identity profile] kouzdra.livejournal.com 2013-09-04 07:35 am (UTC)(link)
О! RSX-11M повеяло (там каталожная система была вообще отделена от файловой).

Или RT-11, где создаваемый файл включался в FS при выполнении операции enter (обычно при закрытии) - ну а если ее не было - то и не включался

[identity profile] pukkallo.livejournal.com 2013-09-04 08:08 am (UTC)(link)
Ну, и здесь идет именно о временных, которые никогда не станут постоянным. Что, кроме security, имеет и бонус в виде не засранного при обломавшихся форках и иных зомби /tmp. Впрочем, вопрос с чисткой мусора при таком подходе таки встает ненавязчиво.

И причина возникновения сильно разная. В RT-11 это было вызвано не security reasons, а тем, что файл писался целым куском (RT, итить), и до момента финализации его размер не был точно известен. С этим проблема с многозадачными мониторами была - если места мало и squeeze не делали, могло не хватить места при записи. Регулярно сталкивался на СМ-4 с TS-монитором с этим.

[identity profile] kouzdra.livejournal.com 2013-09-04 08:17 am (UTC)(link)
Вызвано было и в RSX и RT тем, что собственно совершенно непонятно, зачем вставлять файл в каталог при создании - и поэффективнее и проблем с изобретением уникальных имен нет (в RSX еще и тем, что идея разделить собственно файловую систему и каталожную довольно естественна - каталожная система сопоставляет тебе имени файла его ID, а собственно файловая работает только с плоским пространством ID)

PS: Проблемы с местом в RT к Enter отношения не имели - файл-то все равно писался на диск по ходу. Финализировалась именно запись в каталоге. Что кроме прочего позволяло безопасно овервратить файл новым с тем же именем (и вообще обеспечивало более естественную логику - без всех этих *~) - старый продолжал существовать до выполнения команды enter, а она емнимп была атомарная.
Edited 2013-09-04 09:35 (UTC)

[identity profile] pukkallo.livejournal.com 2013-09-04 03:31 pm (UTC)(link)
По RSX-11 не скажу - прошла мимо. Однако, ЕМНИП, запись в каталоге в RT-11 имела в качестве своей составляющей ссылку на начало физического положения, а файл открывался в самом большом из доступных пустых мест (которые тоже писались в каталог наравне с файлами). Поэтому её финализация по close была естественной для модификации смежной пустой записи. Кроме того, в RT была какая-то команда (не помню точно) - некоторый аналог sync в UNIX, которая обновляла именно запись в каталоге на данный момент и позволяла не потерять сделанных изменений. Или мы это reopen делали ... давно было. Кстати, достоинство существования старого файла при любых сбоях была весьма приятственной особенностью. После смены религи мне этого регулярно не хватало.

Впрочем, я как-то больше пошел по прикладным, поэтому многих подробностей не помню. Надо поспрошать брата, который во времена оные написал на ассемблере аналог squeeze, который использовался на ... Откат был невозможен, при сбое умирало все, но работало раз в 5 быстрее :)

[identity profile] kouzdra.livejournal.com 2013-09-05 12:47 am (UTC)(link)
Поэтому её финализация по close была естественной для модификации смежной пустой записи.

Разумеется - так для close подобные функции естественны довольно таки



А в RSX каталог был просто файлом с записями по 16B емнимп, которые устанвливали соответствие имяфайла -> его ID - (ID - пара - порядковый номер, контрольное значение, потом появился третий - номер устройства кажется, или хоста).

Файловый процессор в принципе умел по отдельному каталогу искать (хотя я так и не очень понял зачем), а уже работа с вложенными каталогами делалась просто на уровне user space библиотеки (что забавно - хотя структура была формально двух уровневой - главный каталог - пользовательские - зашито было исключительно на уровне соглашений об именовании файлов и соответствующих функций. Уже утилита Verify (тамошний fsck) работала с произвольной вложенностью каталогов и произвольными же их именами.

А собственно файл с точки зрения системы представлялся именно ID.
Edited 2013-09-05 00:47 (UTC)

[identity profile] gineer.livejournal.com 2013-09-04 04:50 pm (UTC)(link)
\\Впрочем, вопрос с чисткой мусора при таком подходе таки встает ненавязчиво.

ужо
http://beldmit.livejournal.com/402695.html?thread=4380167#t4380167

последний Дебиан, если че. :)

[identity profile] kouzdra.livejournal.com 2013-09-05 12:41 am (UTC)(link)
fsck все равно гоняется регулярно.

[identity profile] gineer.livejournal.com 2013-09-05 03:53 pm (UTC)(link)
вы из какого столетия?
счас все фсы с журналами ;)

[identity profile] kouzdra.livejournal.com 2013-09-05 05:21 pm (UTC)(link)
Я знаю - тем не менее -"гоняется регулярно"

[identity profile] gineer.livejournal.com 2013-09-05 03:50 pm (UTC)(link)
\\Впрочем, вопрос с чисткой мусора при таком подходе таки встает ненавязчиво.

ужо
http://beldmit.livejournal.com/402695.html?thread=4380167#t4380167

последний Дебиан, если че. :)

[identity profile] oboguev.livejournal.com 2013-09-05 10:36 pm (UTC)(link)
Скорее это child of mmap(MAP_ANON), ну или для тех, кто помнит, что было раньше, SYS$CRMPSC(SEC$M_PAGFIL).

[identity profile] kouzdra.livejournal.com 2013-09-06 03:30 am (UTC)(link)
Там скорее поиски решения проблемы, которой в упомянутых системах не было by design - причем не по ошибке не было.

Ну да - само найденное решение - кривое. Но его источник - дурацкая идея привязать ресурс (файл) к записи в каталоге - в RSX оно кстати было отзеркалено на уровне процессов - там запуск задачи требовал ее обязательной регистрации - в результате была и команда RUN и всякие спецфункции которые автоматом выдумывали для процесса имя, его регистрировали, запускали, а по завершении - удаляли.

[identity profile] http://users.livejournal.com/_iga/ 2013-09-04 02:00 pm (UTC)(link)
Это называется - встроили руткит прямо в ядро :-(

[identity profile] gineer.livejournal.com 2013-09-04 04:48 pm (UTC)(link)
о, по ходу я именно с этой фигней и столкнулся...
в виде, что-то отъедает раздел /тмп а самих файлов и не видать
lodin: A bearded hacker in a hat (Шляпа)

[personal profile] lodin 2013-09-04 10:26 pm (UTC)(link)
Так это и в режиме "создал-удалил" можно отъесть, или нет?
ext_646638: (Default)

[identity profile] rdia.livejournal.com 2013-09-05 02:46 am (UTC)(link)
Да.

[identity profile] gineer.livejournal.com 2013-09-05 03:52 pm (UTC)(link)
ага
но там его хоть видно будет
и можно попробовать удалить и/или щелкнуть поносу процесс