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