Den 13. marts blev der udgivet en korrigerende version 3.51.3 af den kompakte indbyggede DBMS SQLite. Projektkoden er skrevet i C og distribueres som public domain.
På grund af tilbageførselskompatibilitetsproblemer i forbindelse med nogle nye funktioner, blev versionen 3.52.0 (udgivet den 6. marts) trukket tilbage.
Ændringslisten for version 3.51.3:
- Den 3. marts opdagede og rettede en af udviklerne af SQLite (Dan) en fejl, der i sjældne tilfælde kunne føre til databasebeskadigelse, kaldet «WAL-reset bug»:
- Denne fejl opstår kun i databaser, der kører i WAL-tilstand, hvis der er åbnet to eller flere forbindelser til den samme fil i forskellige tråde eller processer, og hvis disse to forbindelser forsøger at udføre en skrivning eller oprette et kontrolpunkt samtidig.
- Fejlen er relateret til dataadgangskonflikter under strenge tidsbegrænsninger. Under normale driftsforhold opstår den ekstremt sjældent. Udviklerne har ikke været i stand til at genskabe denne fejl under naturlige forhold og måtte tilføje en speciel testlogik til SQLite, der bevidst skaber betingelser for at fremkalde fejlen for at sikre, at problemet er løst.
- Fejlen opstår når:
- En forbindelse udfører en kontrolpunktkontrol. Denne første kontrol skal være afsluttet. Med andre ord skal hele indholdet af WAL-filen succesfuldt kopieres tilbage til databasen, og WAL-filen skal bringes i en tilstand, hvor den kan nulstilles.
- Straks efter afslutningen af den første kontrolpunkt, startes den anden.
- Mens den anden kontrolpunkt fra trin 2 starter, bogfører en anden databaseforbindelse en transaktion, der nulstiller WAL-filen og skriver nyt indhold i begyndelsen af WAL-filen.
- På grund af dataadgangskonflikten tager den anden kontrolpunkt fra trin 2 ikke hensyn til, at WAL-filen blev nulstillet som følge af transaktionsbogføringen i trin 3. Den anden kontrolpunkt sætter en forkert værdi for et af felterne i WAL-indeksoverskriften. Dette felt angiver, at en del af WAL-filen allerede er blevet bogført i kontrolpunktet, selvom det faktisk ikke er tilfældet.
- Registrering af yderligere transaktioner fører til en stigning i antallet af sider i WAL-filen, som overstiger antallet af sider, der eksisterede på tidspunktet for det første kontrolpunkt fra trin 1.
- Senere, når det tredje kontrolpunkt opstår, springer det over hele eller dele af transaktionen, der blev registreret i trin 3. Dermed når dele af transaktionen fra trin 3 ikke ind i databasefilen, hvilket resulterer i, at databasefilen bliver beskadiget.
- Fejlen er sandsynligvis til stede i alle versioner af SQLite, fra 3.7.0 (21.07.2010) til 3.51.2. Der er også udgivet rettelser for nogle tidligere versioner: 3.44.6 og 3.50.7.
- Andre mindre rettelser.
Kilde: linux.org.ru
