Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将文件描述符与readlink()一起使用_C_Filenames_File Descriptor - Fatal编程技术网

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

C 将文件描述符与readlink()一起使用,c,filenames,file-descriptor,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'; t

有一种情况,我需要获取一个文件名,以便调用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);
charbuf[PATH_MAX];
char-tempFD[2]//创建的临时文件的文件描述符编号
tempFD[0]=fi->fh+'0';
tempFD[1]='\0';
char-parentFD[2]//原始文件的文件描述符编号
parentFD[0]=(fi->fh-1)+“0”;
parentFD[1]='\0';
if(readlink(tempFD、buf、sizeof(buf))<0){
日志消息(“\treadlink()错误\n”);
perror(“readlink()错误”);
}否则
log_msg(“readlink()为'%s'返回'%s'\n',buf,tempFD);
这是FUSE文件系统的一部分。该结构称为fi,文件描述符存储在fh中,fh的类型为uint64\t。由于该程序的执行方式,我知道两个链接文件的文件描述符编号总是相差1。至少这是我的工作假设,我正试图用这段代码来验证

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


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

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

但是,如果您能够选择文件名,而不是依赖于
/proc
,这将是最好的选择。至少,您可以用使用链接器标志的包装器函数替换对库函数的调用。用法示例为
gcc program.c-Wl,-wrap,函数tobeoveriden-o程序
,所有对库函数的调用都将链接到函数tobeoveriden;原始函数的名称为uu real u thefunctiontobeoveriden,可以访问。有关详细信息,请参见此答案

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

 char fd_path[100];
 snprintf("/proc/%d/fd/%d", sizeof(fd_path), getpid(), fi->fh);
您现在应该使用此
/proc/..
路径(它是一个软链接),而不是使用它链接到的路径

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

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

如果您的文件是
/tmp/a.txt
并且被删除,
/proc/…
路径上的
readlink
将返回
/tmp/a.txt(已删除)
。如果此路径存在,您将能够访问它!,当您想访问另一个文件时(
/tmp/a.txt
)。攻击者可能能够在
/tmp/a.txt(已删除)
文件中提供恶意内容

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

而不是
/proc//fd
,您可以使用
/proc/self/fd