Fix an assert() in btree.c that might have fired on a corrupt database file.

FossilOrigin-Name: 5ab2b3e300b70bc04cdead69275f8f734ea2d885
This commit is contained in:
drh 2009-12-03 21:26:52 +00:00
parent 313aa5735a
commit c9b9b8aab7
3 changed files with 16 additions and 11 deletions

View File

@ -1,8 +1,8 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
C Remove\sa\sNEVER()\sfrom\sbtree.c\sthat\scould\soccur\sin\sa\svery\sobscure\stested\nevaluation\swith\san\sI/O\serror\son\sfstat().
D 2009-12-03T19:40:00
C Fix\san\sassert()\sin\sbtree.c\sthat\smight\shave\sfired\son\sa\scorrupt\sdatabase\sfile.
D 2009-12-03T21:26:53
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in c5827ead754ab32b9585487177c93bb00b9497b3
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -111,7 +111,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
F src/backup.c 744e98359dfc79fed43e8dec911e33e108b06aae
F src/bitvec.c 06ad2c36a9c3819c0b9cbffec7b15f58d5d834e0
F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff
F src/btree.c e6f7c7bbb1a888fdf1a2c5b83a4efebf2dc13326
F src/btree.c 086f343d8b7bc37eabd2cf81dbbce3db37a093da
F src/btree.h 7944a9dac59eb3e541aad45fd2747f1051e7c63d
F src/btreeInt.h 54f4245decd0409ea52cf9aee422d3d761d7ac10
F src/build.c a48e74d24897100017d39ceba5de255e53ec9488
@ -779,14 +779,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 75863c2d55e0801add5b8dcf88d575c5c870af04
R 2b7a161eaee6afd6b881b53584d9aa6b
P d5861d9ffecca499d79d722b5f742ffe3a5aff44
R 672739783a57cc2945d2711dc3624ee1
U drh
Z da696b30584703ae55e60b117c5da01a
Z 8b12fd840dfeb2d0d552e6c6adcc395d
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFLGBQToxKgR168RlERAiGTAJ9mUJN1i4Ic+WSNCIGMUesT59i0xQCeONoR
J6K+b4rPUbkVZNhiJY2wehI=
=sv5f
iD8DBQFLGC0goxKgR168RlERAsceAJ4tPVtQmWVNN9jH7h66NAP7ntVM3QCffxuS
O3PLkAGKJceDIgUe5VAtAtE=
=AN6z
-----END PGP SIGNATURE-----

View File

@ -1 +1 @@
d5861d9ffecca499d79d722b5f742ffe3a5aff44
5ab2b3e300b70bc04cdead69275f8f734ea2d885

View File

@ -5295,8 +5295,13 @@ static void insertCell(
assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=5460 );
assert( pPage->nOverflow<=ArraySize(pPage->aOvfl) );
assert( sz==cellSizePtr(pPage, pCell) );
assert( sqlite3_mutex_held(pPage->pBt->mutex) );
/* The cell should normally be sized correctly. However, when moving a
** malformed cell from a leaf page to an interior page, if the cell size
** wanted to be less than 4 but got rounded up to 4 on the leaf, then size
** might be less than 8 (leaf-size + pointer) on the interior node. Hence
** the term after the || in the following assert(). */
assert( sz==cellSizePtr(pPage, pCell) || (sz==8 && iChild>0) );
if( pPage->nOverflow || sz+2>pPage->nFree ){
if( pTemp ){
memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip);