3月13日,發布了緊湊型嵌入式資料庫管理系統3.51.3的修正版本。 SQLite的專案代碼用 C 語言編寫,並以公共領域發布。
由於某些新功能有向後相容性問題,版本 3.52.0 (3月6日發布)已被撤回。
3.51.3版變更清單:
- 3月3日,SQLite開發人員之一(Dan)發現並修復了一個在極少數情況下可能導致資料庫損壞的漏洞,該漏洞被稱為 WA 重設錯誤:
- 只有當資料庫以 WAL 模式運行時,如果兩個或多個連接在不同的線程或進程中打開到同一個文件,並且這兩個連接同時嘗試寫入或建立檢查點,才會出現此錯誤。
- 該錯誤與嚴格時間限制下的資料存取衝突有關。在正常運作條件下,這種情況極為罕見。開發人員無法在實際環境中重現該錯誤,因此被迫在 SQLite 中添加特殊的測試邏輯,人為地製造錯誤發生的條件,以確保問題得到解決。
- 錯誤發生於:
- 一個連線執行檢查點操作。第一個檢查點必須完成。換句話說,檢查點必須成功地將 WAL 檔案的全部內容複製回資料庫,並使 WAL 檔案處於可以刷新的狀態。
- 第一個檢查點完成後,第二個檢查點立即啟動。
- 在步驟 2 的第二個檢查點執行時,另一個資料庫連線提交一個事務,該事務會刷新 WAL 檔案並將新內容寫入 WAL 檔案的開頭。
- 由於資料存取衝突,步驟 2 中的第二個檢查點沒有考慮到步驟 3 中的事務提交導致 WAL 檔案被刷新。第二個檢查點為 WAL 索引頭中的一個欄位設定了錯誤的值。該欄位指示 WAL 文件的一部分在檢查點時已經提交,但實際上並非如此。
- 提交額外的事務會導致 WAL 檔案中的頁數超過步驟 1 中第一個檢查點時存在的頁數。
- 後來,當第三個檢查點出現時,它會跳過階段 3 中寫入的全部或部分事務。因此,階段 3 中的部分事務永遠不會進入資料庫文件,導致資料庫文件損壞。
- 該漏洞似乎存在於所有 SQLite 版本中,從 3.7.0 (2010-07-21) 到 3.51.2 均有發現。一些早期版本也已發布了熱修復程式: 3.44.6 и 3.50.7.
- 其他一些小問題需要修復。
來源: linux.org.ru
