c - 将文件描述符与 readlink() 一起使用

标签 c filenames file-descriptor

我遇到一种情况,我需要获取文件名,以便我可以调用 readlink() 函数。我所拥有的只是一个整数,最初通过 open() 命令存储为文件描述符。问题是,我无权访问执行 open() 命令的函数(如果我访问了,那么我就不会发布这个)。 open() 的返回值存储在我可以访问的结构中。

char buf[PATH_MAX];

char tempFD[2]; //file descriptor number of the temporary file created
tempFD[0] = fi->fh + '0';
tempFD[1] = '\0';

char parentFD[2]; //file descriptor number of the original file
parentFD[0] = (fi->fh - 1) + '0';
parentFD[1] = '\0';

if (readlink(tempFD, buf, sizeof(buf)) < 0) {
    log_msg("\treadlink() error\n");
    perror("readlink() error");
} else 
    log_msg("readlink() returned '%s' for '%s'\n", buf, tempFD);

这是 FUSE 文件系统的一部分。该结构体称为fi,文件描述符存储在fh中,其类型为uint64_t。由于该程序的执行方式,我知道两个链接文件的文件描述符编号始终相隔 1。至少这是我的工作假设,我试图用这段代码来验证它。

这可以编译,但是当我运行它时,我的日志文件每次都会显示 readlink 错误。我的文件描述符中存储了正确的整数值,但它不起作用。

有谁知道如何从这些整数值中获取文件名?谢谢!

最佳答案

如果您的代码变得不可移植并且必须在现代版本的 Linux 上运行是可以接受的,那么您可以使用 /proc/<pid>/fd/<fd> 。但是,我建议不要向 fd 添加“0”作为获取表示数字的字符串的方法,因为它使用 fd < 10 的假设。

但是,如果您能够直接获取文件名而不是依赖 /proc 那就最好了。至少,您可以使用链接器标志将对库函数的调用替换为包装函数。使用示例是 gcc program.c -Wl,-wrap,theFunctionToBeOverriden -o program ,对库函数的所有调用都将链接到 __wrap_theFunctionToBeOverriden;原始函数可以通过名称 __real_theFunctionToBeOverriden 访问。请参阅此答案 https://stackoverflow.com/a/617606/111160了解详情。

但是,回到不涉及链接重新路由的答案:你可以这样做

 char fd_path[100];
 snprintf("/proc/%d/fd/%d", sizeof(fd_path), getpid(), fi->fh);

您现在应该使用这个 /proc/...路径(它是一个软链接(soft link))而不是使用它链接到的路径。

您可以调用readlink查找文件系统中的实际路径。但是,这样做会引入安全漏洞,我建议不要使用路径 readlink返回。

当描述符指向的文件被删除、取消链接后,仍然可以通过 /proc/... 访问它小路。然而,当你 readlink在其上,您将获得原始路径名(附加“(已删除)”文本)。

如果您的文件是/tmp/a.txt它被删除了,readlink关于/proc/...路径返回 /tmp/a.txt (deleted) 。如果此路径存在,您将能够访问它!,而您想要访问不同的文件( /tmp/a.txt )。攻击者可能能够在 /tmp/a.txt (deleted) 中提供恶意内容。文件。

另一方面,如果您只是通过/proc/...访问该文件路径,您将访问正确的(未链接但仍处于事件状态)文件,即使该路径声称是指向其他内容的链接。

关于c - 将文件描述符与 readlink() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117610/

相关文章:

在c中从int转换时间

c - 我觉得 dup2() 是多余的

playframework - Play 框架/Netty 不释放套接字

python-3.x - fnmatch 不显示所有匹配的文件名

file - 用于/f 处理带空格的文件名

c - 从 C 中的文件描述符读取

c - 当我尝试使用 PQnfelds 时,PostgreSQL 说 'symbol not found'

c - 我对数组索引感到困惑

c - 如何使用 C 获取 2D 字符数组中的输入?

python - 使用 os.path 写入带有变量名的输出文件