modlib3.c:21:9:错误:无效使用不完整的typedef';DIR{aka struct_dirstream}
问题是我需要使用LD_PRELOAD来修改opendir()函数,该函数是ls命令的一部分,用于在目标路径不在/home目录中时限制目录的打开。我得到的错误是返回行显示: 返回((*original_opendir)(_name)); 因为原始的_opendir是粗体的,它表示错误:不完整的typedef'DIR{aka struct _distream'的使用无效 我在下面附上了我的代码。如果您有任何想法,请告诉我,我将非常感激![在此处输入图像描述][1] 该文件名为modlib3.c,当我收到错误时,我用以下代码编译了它: //gcc-o modlib3.so-shared-fPIC-D_GNU__SOURCE modlib3.c-ldl 这是我的密码:modlib3.c:21:9:错误:无效使用不完整的typedef';DIR{aka struct_dirstream},c,linux,typedef,ls,opendir,C,Linux,Typedef,Ls,Opendir,问题是我需要使用LD_PRELOAD来修改opendir()函数,该函数是ls命令的一部分,用于在目标路径不在/home目录中时限制目录的打开。我得到的错误是返回行显示: 返回((*original_opendir)(_name)); 因为原始的_opendir是粗体的,它表示错误:不完整的typedef'DIR{aka struct _distream'的使用无效 我在下面附上了我的代码。如果您有任何想法,请告诉我,我将非常感激![在此处输入图像描述][1] 该文件名为modlib3.c,当我
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <syslog.h>
#include <dlfcn.h>
#include <dlfcn.h>
DIR *opendir(const char *_name) {
DIR (*original_opendir)(const char *);
*(void **)(&original_opendir) = dlsym(RTLD_NEXT, "*opendir");
if (strcmp(_name, "/home") <0 || strcmp(_name, "/home")>0){
syslog(LOG_EMERG, "Cannot open! ");
exit(1);
}
return((*original_opendir)(_name));
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
DIR*opendir(常量字符*_名称){
目录(*原始目录)(常量字符*);
*(void**)(&original_opendir)=dlsym(RTLD_NEXT,“*opendir”);
如果(strcmp(_name,“/home”)0){
syslog(LOG_EMERG,“无法打开!”);
出口(1);
}
返回((*original_opendir)(_name));
}
修复了代码中的一些问题,请仔细检查差异
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <syslog.h>
#include <dirent.h>
#include <dlfcn.h>
DIR *opendir(const char *_name) {
DIR *(*original_opendir)(const char *);
*(void **)(&original_opendir) = dlsym(RTLD_NEXT, "opendir");
if (strncmp(_name, "/home", 5)!=0) {
syslog(LOG_EMERG, "Cannot open!");
exit(1);
}
return((*original_opendir)(_name));
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
DIR*opendir(常量字符*_名称){
目录*(*原始目录)(常量字符*);
*(void**)(&original_opendir)=dlsym(RTLD_NEXT,“opendir”);
如果(strncmp(_name,“/home”,5)!=0){
syslog(LOG_EMERG,“无法打开!”);
出口(1);
}
返回((*original_opendir)(_name));
}
您正在尝试重新创建chroot
?本质上我希望ls命令不要打开任何不是来自主目录的内容作为开始,您应该使用realpath(3)
解析符号链接和相对路径名。