最近扫描工具扫出了几个TOCTOU (Time Of Check To Time Of Use)问题,出问题的代码逻辑是在打开文件的时候用lstat获取了文件状态。
经过一番周折找到了解决方法是用fstat替换lstat,举例如下:
int fd = open(argv[1], O_RDWR | O_CREAT, 0666);
if (fd == -1) {
perror("open");
return 1;
}
struct stat st;
if (fstat(fd, &st) == -1) {
perror("fstat");
close(fd);
return 1;
}