Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a case where deleting a row from a corrupt database could cause an assert to fail. (CVS 6881) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
6994b41a94a60f6460cf9814767db321 |
User & Date: | danielk1977 2009-07-11 17:39:42.000 |
Context
2009-07-11
| ||
18:26 | Remove an unused parameter from the accessPayload() function in btree.c. (CVS 6882) (check-in: 7deb6568d8 user: drh tags: trunk) | |
17:39 | Fix a case where deleting a row from a corrupt database could cause an assert to fail. (CVS 6881) (check-in: 6994b41a94 user: danielk1977 tags: trunk) | |
17:04 | Bug fix in the computation of the number of pages to autovacuum when nReserve is greater than zero. (CVS 6880) (check-in: 618a83d65f user: drh tags: trunk) | |
Changes
Changes to src/btree.c.
1 2 3 4 5 6 7 8 9 10 11 | /* ** 2004 April 6 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* ** 2004 April 6 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** $Id: btree.c,v 1.680 2009/07/11 17:39:42 danielk1977 Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. ** Including a description of file format and an overview of operation. */ #include "btreeInt.h" |
︙ | ︙ | |||
3923 3924 3925 3926 3927 3928 3929 | if( rc ) return rc; pCur->apPage[i+1] = pNewPage; pCur->aiIdx[i+1] = 0; pCur->iPage++; pCur->info.nSize = 0; pCur->validNKey = 0; | | | 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 | if( rc ) return rc; pCur->apPage[i+1] = pNewPage; pCur->aiIdx[i+1] = 0; pCur->iPage++; pCur->info.nSize = 0; pCur->validNKey = 0; if( pNewPage->nCell<1 || pNewPage->intKey!=pCur->apPage[i]->intKey ){ return SQLITE_CORRUPT_BKPT; } return SQLITE_OK; } #ifndef NDEBUG /* |
︙ | ︙ |
Changes to test/corrupt.test.
︙ | ︙ | |||
9 10 11 12 13 14 15 | # #*********************************************************************** # This file implements regression tests for SQLite library. # # This file implements tests to make sure SQLite does not crash or # segfault if it sees a corrupt database file. # | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # #*********************************************************************** # This file implements regression tests for SQLite library. # # This file implements tests to make sure SQLite does not crash or # segfault if it sees a corrupt database file. # # $Id: corrupt.test,v 1.11 2009/07/11 17:39:42 danielk1977 Exp $ catch {file delete -force test.db test.db-journal test.bu} set testdir [file dirname $argv0] source $testdir/tester.tcl # Construct a large database for testing. |
︙ | ︙ | |||
170 171 172 173 174 175 176 177 | db close sqlite3 db test.db catchsql { SELECT * FROM t1 WHERE x = 'abcde'; } } {1 {database disk image is malformed}} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | db close sqlite3 db test.db catchsql { SELECT * FROM t1 WHERE x = 'abcde'; } } {1 {database disk image is malformed}} do_test corrupt-4.1 { db close file delete -force test.db test.db-journal sqlite3 db test.db execsql { PRAGMA page_size = 1024; CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); } for {set i 0} {$i < 10} {incr i} { set text [string repeat $i 220] execsql { INSERT INTO t1 VALUES($i, $text) } } execsql { CREATE INDEX i1 ON t1(b) } } {} do_test corrupt-4.2 { set iRoot [db one {SELECT rootpage FROM sqlite_master WHERE name = 'i1'}] set iOffset [hexio_get_int [hexio_read test.db [expr 12+($iRoot-1)*1024] 2]] set data [hexio_render_int32 [expr $iRoot - 1]] hexio_write test.db [expr ($iRoot-1)*1024 + $iOffset] $data db close sqlite3 db test.db # The following DELETE statement attempts to delete a cell stored on the # root page of index i1. After this cell is deleted it must be replaced # by a cell retrieved from the child page (a leaf) of the deleted cell. # This will fail, as the block modified the database image so that the # child page of the deleted cell is from a table (intkey) b-tree, not an # index b-tree as expected. At one point this was causing an assert() # to fail. catchsql { DELETE FROM t1 WHERE rowid = 3 } } {1 {database disk image is malformed}} finish_test |