]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an assert() in btree.c that might have fired on a corrupt database file.
authordrh <drh@noemail.net>
Thu, 3 Dec 2009 21:26:52 +0000 (21:26 +0000)
committerdrh <drh@noemail.net>
Thu, 3 Dec 2009 21:26:52 +0000 (21:26 +0000)
FossilOrigin-Name: 5ab2b3e300b70bc04cdead69275f8f734ea2d885

manifest
manifest.uuid
src/btree.c

index c1adb34c7c457e33126d789b3841e26ec376fd47..1bd1ba3c96d268f57d12c6fad020ca56f7f577f4 100644 (file)
--- a/manifest
+++ b/manifest
@@ -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-----
index f4e0145c8bc7c837b5496a7766f75319c4197459..104be73ecee9f7cf86294461829c1699cee29441 100644 (file)
@@ -1 +1 @@
-d5861d9ffecca499d79d722b5f742ffe3a5aff44
\ No newline at end of file
+5ab2b3e300b70bc04cdead69275f8f734ea2d885
\ No newline at end of file
index cc2279ff4b7c3b4e740b3ba0013216a9f2db8bc9..8b25509b6a3d8a07d653fdf11140151441667871 100644 (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);