SQLite 3.51.3 修正了 WAL 模式下可能出現的資料庫損壞問題

SQLite 3.51.3 修正了 WAL 模式下可能出現的資料庫損壞問題

3月13日,發布了緊湊型嵌入式資料庫管理系統3.51.3的修正版本。 SQLite的專案代碼用 C 語言編寫,並以公共領域發布。

由於某些新功能有向後相容性問題,版本 3.52.0 (3月6日發布)已被撤回。

3.51.3版變更清單:

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

來源: linux.org.ru

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster