ファイルの読み込みの方法によっては脆弱性が発生しうる
ちゃんと考えれば分かる話なんですが。
struct stat statbuf;
if (stat (filename, &statbuf) != 0) {
/* stat できなかったら終了 */
return;
}
if ((statbuf.st_mode & S_IFMT) == S_IFREG) {
/* regular file じゃなかったら終了 */
return;
}
char *buf = malloc (statbuf.st_size);
if (buf == NULL) {
/* malloc できなかったら終了 */
reutrn;
}
int fd = open (filename, O_RDONLY);
if (fd < 0) {
/* open できなかったら終了 */
return;
}
char tmpbuf[4096];
ssize_t nread;
size_t off = 0;
while ((nread = read (fd, tmpbuf, 4096)) > 0) {
memcpy (buf + off, tmpbuf, nread);
off += (size_t)nread;
}
close (fd);
って書くと脆弱性を埋めます(自戒を込めて)。
どこかというと,stat してから open するまでの間にファイルが変更されているかもしれないので, バッファオーバーランやメモリ領域を初期化せずに使うとかいうことになります。