我收到了bug report
那让我挠头。在我的程序中,我测试了
目录的可写性(即用户的主目录
默认情况下),然后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。实际代码是here)
用户(我们叫她USER
)报告收到一条错误消息“无法在其中创建xxx
/ home / USER:权限被拒绝”,在使用USER@host > touch /home/USER/xxx
手动创建文件后消失。
我希望一个不可写的主目录会导致各种
问题,但用户甚至可以简单地touch
在该目录中的文件。
该程序未运行suid,USER拥有自己的主目录(并且 显然可以在其中创建文件)。我的程序显然是唯一的 显示此类问题的程序。它已经被广泛使用 多年来,这是第一次报告此错误
access (2)
的Linux联机帮助页上说
如果发现目录可写,则可能意味着 可以在目录中创建文件
为什么可能?为什么(何时)不总是 (除了竞争情况,例如有人在access()
调用之后立即更改权限,完整的inode表或达到用户限制),所有这些似乎都没有就是这里的问题-尤其是因为access()
调用失败,并且touch xxx
成功。