Каталог недоступен для записи согласно 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 преуспевает.

0 ответов

Другие вопросы по тегам