Каталог недоступен для записи согласно access(), пользователь все еще может создавать файлы в нем
Я получил сообщение об ошибке, из-за которой я почесал голову. В моей программе я проверяю возможность записи каталога (который по умолчанию является домашним каталогом пользователя), прежде чем readline
собирать историю и записывать ее в файл в этом каталоге при выходе из программы.
Вот проблемный код:
if (access(dirname, W_OK) != 0)
complain("cannot create %s in %s", filename, dirname, errno);
else {
use_readline_for_stuff();
write_history("%s/%s", dirname, filename);
exit(0);
}
(Это псевдо-C, конечно. Настоящий код здесь)
Пользователь (давайте назовем ее USER
) сообщает о получении сообщения об ошибке "невозможно создать xxx в /home/USER: разрешение отклонено", которое исчезает после создания файла вручную с USER@host > touch /home/USER/xxx
,
Я бы ожидал, что домашний каталог, который нельзя записать, приведет ко всем видам проблем, но пользователь может просто touch
файл в этом каталоге.
Программа не запускается suid, USER владеет своим домашним каталогом (и, несомненно, может создавать файлы в нем). Моя программа, видимо, единственная программа, которая отображает такую проблему. Он довольно широко использовался в течение многих лет, и впервые об этой ошибке сообщают
Справочная страница Linux для access (2)
говорит
если каталог найден доступным для записи, это, вероятно, означает, что файлы могут быть созданы в каталоге
Почему наверное? Почему (и когда) не всегда (кроме состояния гонки, как кто-то, меняющий права сразу после access()
вызов, полные таблицы inode или превышение пользовательских ограничений) все это, по-видимому, не является проблемой, особенно с access()
вызов не выполняется, и touch xxx
преуспевает.