确定路径是否在目录内

Determine if path is inside directory

在我的应用程序中,我试图检查路径是否在特定目录内。例如,我希望我的应用程序的某些部分无法访问路径 /x/y/z 中的文件。我不能使用传统的文件权限,因为应用程序的其他部分应该能够访问这些文件。

一些 Internet 资源建议使用 realpath 来首先规范化路径,即解析 .. 的所有符号链接和实例(例如 1, 2)。 但是,似乎不可能在没有竞争条件 (TOCTOU) 的情况下执行路径解析,然后执行 open

char *resolved = realpath("/my/potentially/dangerous/path.txt", NULL);
// someone changes any part of the path to a symlink to something else   <--- race condition
if (check_path(resolved)) {
    //                                                                   <--- race condition
    int fd = open(resolved, O_RDONLY);
}

我是不是忽略了什么,或者 POSIX(和 Linux)没有提供任何方法在没有竞争条件的情况下做这样的事情?

'openat2' 怎么样(仅限 Linux)?

一旦有了文件描述符,请查看 man open

Description:

A file descriptor is a reference to an open file description; this reference is unaffected if pathname is subsequently removed or modified to refer to a different file.