SQLite 3.51.3 z poprawką możliwego uszkodzenia bazy danych w trybie WAL

SQLite 3.51.3 z poprawką możliwego uszkodzenia bazy danych w trybie WAL

13 marca odbyła się korekta wydania 3.51.3 kompaktowej wbudowanej bazy danych SQLite. Kod projektu został napisany w języku C i jest rozpowszechniany jako własność publiczna (public domain).

W związku z problemami z wsteczną kompatybilnością związanymi z niektórymi nowymi funkcjami, wersja 3.52.0 (wydana 6 marca) została wycofana.

Lista zmian w wersji 3.51.3:

  • 3 marca jeden z deweloperów SQLite (Dan) odkrył i naprawił błąd, który w rzadkich przypadkach mógł prowadzić do uszkodzenia bazy danych i nazwany „błąd resetowania WAL”:
    • Błąd ten występuje tylko w bazach danych działających w trybie WAL, jeśli do tego samego pliku otwarto dwa lub więcej połączeń w różnych wątkach lub procesach, a te dwa połączenia jednocześnie próbują wykonać zapis lub utworzyć punkt kontrolny.
    • Błąd związany jest z konfliktem dostępu do danych przy ścisłych ograniczeniach czasowych. W normalnych warunkach eksploatacji występuje niezwykle rzadko. Deweloperom nie udało się odtworzyć tego błędu w naturalnych warunkach, więc musieli dodać do SQLite specjalną logikę testowania, która celowo tworzy warunki do wystąpienia błędu, aby upewnić się, że problem został rozwiązany.
    • Błąd występuje, gdy:
      1. Jedno połączenie wykonuje sprawdzenie punktu kontrolnego. To pierwsze sprawdzenie musi być zakończone. Inaczej mówiąc, w trakcie sprawdzenia należy pomyślnie skopiować całą zawartość pliku WAL z powrotem do bazy danych i doprowadzić plik WAL do stanu, w którym można go zresetować.
      2. Natychmiast po zakończeniu pierwszego punktu kontrolnego uruchamia się drugi.
      3. Podczas uruchamiania drugiego punktu kontrolnego z kroku 2, inne połączenie z bazą danych rejestruje transakcję, która resetuje plik WAL i zapisuje nową zawartość na początku pliku WAL.
      4. W wyniku konfliktu dostępu do danych drugi punkt kontrolny z kroku 2 nie uwzględnia, że plik WAL został zresetowany w wyniku rejestracji transakcji w kroku 3. Drugi punkt kontrolny ustawia błędną wartość dla jednego z pól w nagłówku indeksu WAL. To pole wskazuje, że część pliku WAL została już zarejestrowana w punkcie kontrolnym, chociaż w rzeczywistości tak nie jest.
      5. Zatrzymanie dodatkowych transakcji prowadzi do zwiększenia liczby stron w pliku WAL, które przekracza liczbę stron, jakie istniały w momencie pierwszego punktu kontrolnego z kroku 1.
      6. Później, gdy pojawia się trzeci punkt kontrolny, pomija całą lub część transakcji zapisanej w etapie 3. W ten sposób części transakcji z etapu 3 nie trafiają do pliku bazy danych, co prowadzi do uszkodzenia pliku bazy danych.
    • Błąd prawdopodobnie występuje we wszystkich wersjach SQLite, począwszy od 3.7.0 (21.07.2010) do 3.51.2. Poprawki zostały także wydane dla niektórych wcześniejszych wersji: 3.44.6 i 3.50.7.
  • Inne drobne poprawki.

Źródło: linux.org.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster