歡迎您光臨本站 註冊首頁

Linux 內核小bug

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

今天讀著讀著代碼,竟然無意中發現Linux 0.11內核有個小bug,呵呵,人非聖賢孰能無過。
QUOTE:
// 在目錄項數據塊中搜索匹配指定文件名的目錄項,首先讓de 指向數據塊,並在不超過目錄中目錄項數
// 的條件下,循環執行搜索。
i = 0;
de = (struct dir_entry *) bh->b_data;
while (i < entries)
...{
// 如果當前目錄項數據塊已經搜索完,還沒有找到匹配的目錄項,則釋放當前目錄項數據塊。
if ((char *)de >= BLOCK_SIZE+bh->b_data)
...{
brelse(bh);
bh = NULL;
// 在讀入下一目錄項數據塊。若這塊為空,則只要還沒有搜索完目錄中的所有目錄項,就跳過該塊,
// 繼續讀下一目錄項數據塊。若該塊不空,就讓de 指向該目錄項數據塊,繼續搜索。
if (!(block = bmap(*dir,i/DIR_ENTRIES_PER_BLOCK)) || !(bh = bread((*dir)->i_dev,block)))
...{
i += DIR_ENTRIES_PER_BLOCK;
continue;
}
de = (struct dir_entry *) bh->b_data;
}
// 如果找到匹配的目錄項的話,則返回該目錄項結構指針和該目錄項數據塊指針,退出。
if (match(namelen,name,de))
...{
*res_dir = de;
return bh;
}
// 否則繼續在目錄項數據塊中比較下一個目錄項。
de++;
i++;
}

其中 if (!(block = bmap(*dir,i/DIR_ENTRIES_PER_BLOCK)) || !(bh = bread((*dir)->i_dev,block))) 如果bh讀取失敗,將跳出本次循環,然而在下次循環時又會引用bh這個結構指針,因為上次調用是失敗的,所以可能出現內存無效引用,導致出現錯誤。不過聽趙博說這個錯誤其實 "很少發生或者幾乎不會發生",所以一直到Linux 1.00版這個bug才修正!

作者:刺蝟

[火星人 ] Linux 內核小bug已經有488次圍觀

http://coctec.com/docs/linux/show-post-186742.html