我收到了一个
让我摸不着头脑的错误报告。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
)报告收到错误消息“无法在 /home/USER 中创建 xxx:权限被拒绝”,在手动创建文件后消失USER@host > touch /home/USER/xxx
。
我希望一个不可写的主目录会导致各种问题,但用户甚至可以只是touch
该目录中的一个文件。
该程序不运行 suid,USER 拥有她的主目录(并且显然可以在其中创建文件)。我的程序显然是唯一显示此类问题的程序。它已被广泛使用多年,这是第一次报告此错误
Linux手册页access (2)
说
如果发现一个目录是可写的,那可能意味着该目录下可以创建文件
为什么可能?为什么(以及何时)并非总是如此(除了竞争条件,例如有人在access()
调用后更改权限、完整的 inode 表或达到用户限制)所有这些似乎都不是问题 - 特别是因为access()
调用失败,并且touch xxx
成功。