Каталог недоступен для записи согласно access (), пользователь все еще может создавать файлы в нем - PullRequest
0 голосов
/ 11 октября 2018

Я получил сообщение об ошибке , в котором я почесал голову.В моей программе я проверяю возможность записи каталога (который по умолчанию является домашним каталогом пользователя) перед тем, как 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(), полные таблицы инодов или нарушает пользовательские ограничения), все из которых не кажутся проблемойздесь - тем более, что вызов access() завершается неудачно, а touch xxx завершается успешно.

...