ファイルの読み込みの方法によっては脆弱性が発生しうる

ちゃんと考えれば分かる話なんですが。

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 するまでの間にファイルが変更されているかもしれないので, バッファオーバーランやメモリ領域を初期化せずに使うとかいうことになります。