]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem causing the recovery extension to use excessive memory and CPU time...
authordan <Dan Kennedy>
Thu, 9 May 2024 17:45:21 +0000 (17:45 +0000)
committerdan <Dan Kennedy>
Thu, 9 May 2024 17:45:21 +0000 (17:45 +0000)
FossilOrigin-Name: bc394acb6e6bcaccd17d8afe559d743799c0cb8d7aec709306181673a35dcb86

ext/recover/dbdata.c
ext/recover/recovercorrupt3.test [new file with mode: 0644]
manifest
manifest.uuid

index ca6371026e571f7c0f678d6daf96e27223c8acaf..1905e68813e1dd353c5ed2527f7bc568323b09c3 100644 (file)
@@ -88,6 +88,15 @@ typedef unsigned int u32;
 
 typedef struct DbdataTable DbdataTable;
 typedef struct DbdataCursor DbdataCursor;
+typedef struct DbdataBuffer DbdataBuffer;
+
+/*
+** Buffer type.
+*/
+struct DbdataBuffer {
+  u8 *aBuf;
+  sqlite3_int64 nBuf;
+};
 
 /* Cursor object */
 struct DbdataCursor {
@@ -104,7 +113,7 @@ struct DbdataCursor {
   sqlite3_int64 iRowid;
 
   /* Only for the sqlite_dbdata table */
-  u8 *pRec;                       /* Buffer containing current record */
+  DbdataBuffer rec;
   sqlite3_int64 nRec;             /* Size of pRec[] in bytes */
   sqlite3_int64 nHdr;             /* Size of header in bytes */
   int iField;                     /* Current field number */
@@ -149,6 +158,31 @@ struct DbdataTable {
       "  schema TEXT HIDDEN"      \
       ")"
 
+/*
+** Ensure the buffer passed as the first argument is at least nMin bytes
+** in size. If an error occurs while attempting to resize the buffer,
+** SQLITE_NOMEM is returned. Otherwise, SQLITE_OK.
+*/
+static int dbdataBufferSize(DbdataBuffer *pBuf, sqlite3_int64 nMin){
+  if( nMin>pBuf->nBuf ){
+    sqlite3_int64 nNew = nMin+16384;
+    u8 *aNew = (u8*)sqlite3_realloc64(pBuf->aBuf, nNew);
+
+    if( aNew==0 ) return SQLITE_NOMEM;
+    pBuf->aBuf = aNew;
+    pBuf->nBuf = nNew;
+  }
+  return SQLITE_OK;
+}
+
+/*
+** Release the allocation managed by buffer pBuf.
+*/
+static void dbdataBufferFree(DbdataBuffer *pBuf){
+  sqlite3_free(pBuf->aBuf);
+  memset(pBuf, 0, sizeof(*pBuf));
+}
+
 /*
 ** Connect to an sqlite_dbdata (pAux==0) or sqlite_dbptr (pAux!=0) virtual 
 ** table.
@@ -289,8 +323,7 @@ static void dbdataResetCursor(DbdataCursor *pCsr){
   pCsr->iField = 0;
   pCsr->bOnePage = 0;
   sqlite3_free(pCsr->aPage);
-  sqlite3_free(pCsr->pRec);
-  pCsr->pRec = 0;
+  dbdataBufferFree(&pCsr->rec);
   pCsr->aPage = 0;
 }
 
@@ -551,7 +584,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
       }
     }else{
       /* If there is no record loaded, load it now. */
-      if( pCsr->pRec==0 ){
+      if( pCsr->nRec==0 ){
         int bHasRowid = 0;
         int nPointer = 0;
         sqlite3_int64 nPayload = 0;
@@ -595,6 +628,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
           }else{
             iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
             if( nPayload>0x7fffff00 ) nPayload &= 0x3fff;
+            if( nPayload==0 ) nPayload = 1;
           }
     
           /* If this is a leaf intkey cell, load the rowid */
@@ -629,13 +663,12 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
             /* Allocate space for payload. And a bit more to catch small buffer
             ** overruns caused by attempting to read a varint or similar from 
             ** near the end of a corrupt record.  */
-            pCsr->pRec = (u8*)sqlite3_malloc64(nPayload+DBDATA_PADDING_BYTES);
-            if( pCsr->pRec==0 ) return SQLITE_NOMEM;
-            memset(pCsr->pRec, 0, nPayload+DBDATA_PADDING_BYTES);
-            pCsr->nRec = nPayload;
+            rc = dbdataBufferSize(&pCsr->rec, nPayload+DBDATA_PADDING_BYTES);
+            if( rc!=SQLITE_OK ) return rc;
+            assert( nPayload!=0 );
 
             /* Load the nLocal bytes of payload */
-            memcpy(pCsr->pRec, &pCsr->aPage[iOff], nLocal);
+            memcpy(pCsr->rec.aBuf, &pCsr->aPage[iOff], nLocal);
             iOff += nLocal;
 
             /* Load content from overflow pages */
@@ -653,19 +686,22 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
 
                 nCopy = U-4;
                 if( nCopy>nRem ) nCopy = nRem;
-                memcpy(&pCsr->pRec[nPayload-nRem], &aOvfl[4], nCopy);
+                memcpy(&pCsr->rec.aBuf[nPayload-nRem], &aOvfl[4], nCopy);
                 nRem -= nCopy;
 
                 pgnoOvfl = get_uint32(aOvfl);
                 sqlite3_free(aOvfl);
               }
+              nPayload -= nRem;
             }
+            memset(&pCsr->rec.aBuf[nPayload], 0, DBDATA_PADDING_BYTES);
+            pCsr->nRec = nPayload;
     
-            iHdr = dbdataGetVarintU32(pCsr->pRec, &nHdr);
+            iHdr = dbdataGetVarintU32(pCsr->rec.aBuf, &nHdr);
             if( nHdr>nPayload ) nHdr = 0;
             pCsr->nHdr = nHdr;
-            pCsr->pHdrPtr = &pCsr->pRec[iHdr];
-            pCsr->pPtr = &pCsr->pRec[pCsr->nHdr];
+            pCsr->pHdrPtr = &pCsr->rec.aBuf[iHdr];
+            pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nHdr];
             pCsr->iField = (bHasRowid ? -1 : 0);
           }
         }
@@ -673,7 +709,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
         pCsr->iField++;
         if( pCsr->iField>0 ){
           sqlite3_int64 iType;
-          if( pCsr->pHdrPtr>=&pCsr->pRec[pCsr->nRec] 
+          if( pCsr->pHdrPtr>=&pCsr->rec.aBuf[pCsr->nRec] 
            || pCsr->iField>=DBDATA_MX_FIELD
           ){
             bNextPage = 1;
@@ -681,8 +717,8 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
             int szField = 0;
             pCsr->pHdrPtr += dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
             szField = dbdataValueBytes(iType);
-            if( (pCsr->nRec - (pCsr->pPtr - pCsr->pRec))<szField ){
-              pCsr->pPtr = &pCsr->pRec[pCsr->nRec];
+            if( (pCsr->nRec - (pCsr->pPtr - pCsr->rec.aBuf))<szField ){
+              pCsr->pPtr = &pCsr->rec.aBuf[pCsr->nRec];
             }else{
               pCsr->pPtr += szField;
             }
@@ -692,20 +728,18 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
 
       if( bNextPage ){
         sqlite3_free(pCsr->aPage);
-        sqlite3_free(pCsr->pRec);
         pCsr->aPage = 0;
-        pCsr->pRec = 0;
+        pCsr->nRec = 0;
         if( pCsr->bOnePage ) return SQLITE_OK;
         pCsr->iPgno++;
       }else{
-        if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->pRec[pCsr->nHdr] ){
+        if( pCsr->iField<0 || pCsr->pHdrPtr<&pCsr->rec.aBuf[pCsr->nHdr] ){
           return SQLITE_OK;
         }
 
         /* Advance to the next cell. The next iteration of the loop will load
         ** the record and so on. */
-        sqlite3_free(pCsr->pRec);
-        pCsr->pRec = 0;
+        pCsr->nRec = 0;
         pCsr->iCell++;
       }
     }
@@ -895,12 +929,12 @@ static int dbdataColumn(
       case DBDATA_COLUMN_VALUE: {
         if( pCsr->iField<0 ){
           sqlite3_result_int64(ctx, pCsr->iIntkey);
-        }else if( &pCsr->pRec[pCsr->nRec] >= pCsr->pPtr ){
+        }else if( &pCsr->rec.aBuf[pCsr->nRec] >= pCsr->pPtr ){
           sqlite3_int64 iType;
           dbdataGetVarintU32(pCsr->pHdrPtr, &iType);
           dbdataValue(
               ctx, pCsr->enc, iType, pCsr->pPtr, 
-              &pCsr->pRec[pCsr->nRec] - pCsr->pPtr
+              &pCsr->rec.aBuf[pCsr->nRec] - pCsr->pPtr
           );
         }
         break;
diff --git a/ext/recover/recovercorrupt3.test b/ext/recover/recovercorrupt3.test
new file mode 100644 (file)
index 0000000..9a7c2d0
--- /dev/null
@@ -0,0 +1,549 @@
+# 2024 May 1
+#
+# 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.
+#
+#***********************************************************************
+#
+
+source [file join [file dirname [info script]] recover_common.tcl]
+set testprefix recovercorrupt3
+
+#|      0: d5 d5 9b d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5 d5   ................
+#|     16: 04 00 00 00 1d 00 00 00 00 00 00 00 5f 5f 5f 5f   ............____
+#|     32: 5f 5f 5f 5f 5f 5f 5f 5f 71 5f 5f 5f 02 02 02 02   ________q___....
+#|     48: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+#|     64: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+#|     80: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+#|     96: 02 02 02 02
+
+#-------------------------------------------------------------------------
+reset_db
+do_test 1.0 {
+  sqlite3 db {}
+  db deserialize [decode_hexdb {
+| size 3821 pagesize 1024 filename clusterfuzz-testcase-sql_recovery_fuzzer-5803962339885056
+| page 1 offset 0
+|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
+|     16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 02   .....@  ........
+|     32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04   ................
+|     48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00   ................
+|     80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01   ................
+|     96: 00 2e 7a 70 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    112: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    128: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    144: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    160: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    176: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    192: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    208: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    224: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    240: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    256: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    272: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    288: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 a0 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 29 29   ..............))
+|    464: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    480: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    496: 29 29 29 dd dd dd dd dd dd dd dd dd dd dd dd dd   ))).............
+|    512: dd dd dd dd dd dd dd dd dd 6e 69 d2 e9 e9 e9 d2   .........ni.....
+|    528: d2 d2 d2 d2 dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    544: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    560: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    576: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    592: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    608: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    624: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    640: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    656: dd dd dd dd dd dd dd da dd dd dd dd dd dd dd dd   ................
+|    672: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    688: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    704: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    720: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    736: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    752: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    768: dd dd dd dd dd dd dd dd dd dd dd dd dd 29 29 29   .............)))
+|    784: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    800: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    816: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    832: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    848: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    864: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    880: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    896: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    912: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    928: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    944: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    960: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    976: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    992: 29 29 29 29 29 29 29 29 29 29 dd dd dd dd dd dd   ))))))))))......
+|   1008: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+| page 2 offset 1024
+|      0: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     16: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     32: dd dd 6e 69 d2 e9 e9 e9 d2 d2 d2 d2 d2 dd dd dd   ..ni............
+|     48: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     64: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     80: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     96: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    112: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    128: dd dd dd dd dd dd 29 29 29 29 29 29 29 29 29 29   ......))))))))))
+|    144: 29 29 29 29 29 29 29 29 29 ad a5 29 29 29 29 00   )))))))))..)))).
+|    160: 75 9c 11 00 5b e5 64 28 7c ca 09 69 28 2d 69 00   u...[.d(|..i(-i.
+|    176: 85 88 6c 81 48 83 a0 93 c0 c0 82 8b 81 84 85 f9   ..l.H...........
+|    192: 88 7a 00 7f 00 96 40 7b 12 4b 84 75 a0 00 99 a0   .z....@..K.u....
+|    208: df a0 7e 81 c6 90 8f 7f 84 85 cc 84 82 90 88 60   ..~............`
+|    224: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    240: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    256: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    272: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    288: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    464: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    480: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    496: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    512: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    528: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    544: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    560: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    576: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    592: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    608: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    624: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    640: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    656: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    672: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    688: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    704: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    720: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    736: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    752: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    768: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    784: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    800: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    816: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    832: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    848: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    864: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    880: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    896: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    912: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    928: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    944: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    960: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    976: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    992: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|   1008: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+| page 3 offset 2048
+|      0: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     16: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     32: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     48: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     64: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     80: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     96: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    112: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    128: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    144: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    160: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    176: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    192: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    208: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    224: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    240: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    256: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    272: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    288: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    464: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    480: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    496: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    512: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    528: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    544: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    560: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    576: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    592: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    608: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    624: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    640: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    656: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    672: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    688: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    704: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    720: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    736: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    752: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    768: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    784: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    800: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    816: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    832: 02 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    848: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    864: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    880: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    896: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    912: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    928: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    944: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    960: 80 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    976: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    992: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|   1008: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+| page 4 offset 3072
+|      0: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     16: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     32: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     48: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     64: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     80: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     96: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    112: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    128: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    144: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    160: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    176: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    192: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    208: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    224: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    240: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    256: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    272: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    288: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    464: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    480: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    496: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    512: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    528: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    544: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    560: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    576: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    592: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    608: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    624: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    640: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    656: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    672: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    688: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    704: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    720: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    736: 5f 5f 5f 5f 5f 5f 5f 00 d5 fe fe fe 08 00 00 00   _______.........
+| end clusterfuzz-testcase-sql_recovery_fuzzer-5803962339885056
+}]} {}
+
+sqlite3_dbdata_init db
+do_execsql_test 1.1 {
+  PRAGMA writable_schema = 1;
+}
+
+do_test 1.2 {
+  set R [sqlite3_recover_init db main test.db2]
+  $R run
+  $R finish
+} {}
+
+#-------------------------------------------------------------------------
+reset_db
+do_test 2.0 {
+  sqlite3 db {}
+  db deserialize [decode_hexdb {
+| size 3821 pagesize 1024 filename clusterfuzz-testcase-sql_recovery_fuzzer-5803962339885056
+| page 1 offset 0
+|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
+|     16: 04 00 01 01 00 40 20 20 00 00 00 01 00 00 00 02   .....@  ........
+|     32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04   ................
+|     48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00   ................
+|     80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01   ................
+|     96: 00 2e 7a 70 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    112: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    128: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    144: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    160: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    176: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    192: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    208: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    224: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    240: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    256: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    272: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    288: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 a0 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 29 29   ..............))
+|    464: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    480: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    496: 29 29 29 dd dd dd dd dd dd dd dd dd dd dd dd dd   ))).............
+|    512: dd dd dd dd dd dd dd dd dd 6e 69 d2 e9 e9 e9 d2   .........ni.....
+|    528: d2 d2 d2 d2 dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    544: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    560: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    576: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    592: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    608: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    624: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    640: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    656: dd dd dd dd dd dd dd da dd dd dd dd dd dd dd dd   ................
+|    672: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    688: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    704: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    720: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    736: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    752: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    768: dd dd dd dd dd dd dd dd dd dd dd dd dd 29 29 29   .............)))
+|    784: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    800: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    816: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    832: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    848: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    864: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    880: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    896: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    912: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    928: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    944: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    960: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    976: 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29   ))))))))))))))))
+|    992: 29 29 29 29 29 29 29 29 29 29 dd dd dd dd dd dd   ))))))))))......
+|   1008: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+| page 2 offset 1024
+|      0: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     16: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     32: dd dd 6e 69 d2 e9 e9 e9 d2 d2 d2 d2 d2 dd dd dd   ..ni............
+|     48: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     64: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     80: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|     96: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    112: dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd   ................
+|    128: dd dd dd dd dd dd 29 29 29 29 29 29 29 29 29 29   ......))))))))))
+|    144: 29 29 29 29 29 29 29 29 29 ad a5 29 29 29 29 00   )))))))))..)))).
+|    160: 75 9c 11 00 5b e5 64 28 7c ca 09 69 28 2d 69 00   u...[.d(|..i(-i.
+|    176: 85 88 6c 81 48 83 a0 93 c0 c0 82 8b 81 84 85 f9   ..l.H...........
+|    192: 88 7a 00 7f 00 96 40 7b 12 4b 84 75 a0 00 99 a0   .z....@..K.u....
+|    208: df a0 7e 81 c6 90 8f 7f 84 85 cc 84 82 90 88 60   ..~............`
+|    224: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    240: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    256: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    272: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    288: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    464: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    480: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    496: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    512: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    528: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    544: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    560: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    576: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    592: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    608: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    624: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    640: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    656: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    672: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    688: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    704: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    720: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    736: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    752: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    768: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    784: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    800: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    816: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    832: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    848: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    864: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    880: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    896: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    912: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    928: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    944: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    960: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    976: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    992: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|   1008: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+| page 3 offset 2048
+|      0: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     16: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     32: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     48: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     64: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     80: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     96: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    112: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    128: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    144: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    160: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    176: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    192: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    208: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    224: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    240: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    256: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    272: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    288: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    464: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    480: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    496: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    512: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    528: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    544: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    560: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    576: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    592: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    608: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    624: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    640: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    656: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    672: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    688: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    704: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    720: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    736: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    752: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    768: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    784: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    800: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    816: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    832: 02 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    848: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    864: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    880: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    896: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    912: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    928: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    944: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80   ................
+|    960: 80 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    976: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    992: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|   1008: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+| page 4 offset 3072
+|      0: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     16: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     32: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     48: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     64: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     80: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|     96: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    112: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    128: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    144: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    160: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    176: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    192: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    208: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    224: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    240: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    256: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    272: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    288: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    304: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    320: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    336: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    352: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    368: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    384: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    400: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    416: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    432: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    448: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    464: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    480: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    496: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    512: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    528: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    544: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    560: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    576: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    592: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    608: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    624: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    640: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    656: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    672: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    688: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    704: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    720: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02   ................
+|    736: 5f 5f 5f 5f 5f 5f 5f 00 d5 fe fe fe 08 00 00 00   _______.........
+| end clusterfuzz-testcase-sql_recovery_fuzzer-5803962339885056
+}]} {}
+
+sqlite3_dbdata_init db
+do_execsql_test 2.1 {
+  PRAGMA writable_schema = 1;
+}
+
+do_test 2.2 {
+  set R [sqlite3_recover_init db main test.db2]
+  $R run
+  $R finish
+} {}
+
+finish_test
+
index e068a441ae061f13140a8ddd4c4bc1adb5106417..edbed27f8c2028b75c5a91226848ce5adcaf33a6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Version\s3.45.3
-D 2024-04-15T13:34:05.554
+C Fix\sa\sproblem\scausing\sthe\srecovery\sextension\sto\suse\sexcessive\smemory\sand\sCPU\stime\sin\ssome\scases.
+D 2024-05-09T17:45:21.894
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -467,13 +467,14 @@ F ext/rbu/rbuvacuum4.test ffccd22f67e2d0b380d2889685742159dfe0d19a3880ca3d2d1d69
 F ext/rbu/sqlite3rbu.c d4ddf8f0e93772556e452a6c2814063cf47efb760a0834391a9d0cd9859fa4b9
 F ext/rbu/sqlite3rbu.h 9d923eb135c5d04aa6afd7c39ca47b0d1d0707c100e02f19fdde6a494e414304
 F ext/rbu/test_rbu.c ee6ede75147bc081fe9bc3931e6b206277418d14d3fbceea6fdc6216d9b47055
-F ext/recover/dbdata.c d2e00d3cac74319c9c6def2e56ab2146b4f4ba5d820ab275e8da24e9766c247e
+F ext/recover/dbdata.c e518c1a221a259a1ea594d9db8fce356861bfa450e6f54eda999242b9bd5c50a
 F ext/recover/recover1.test c484d01502239f11b61f23c1cee9f5dd19fa17617f8974e42e74d64639c524cf
 F ext/recover/recover_common.tcl a61306c1eb45c0c3fc45652c35b2d4ec19729e340bdf65a272ce4c229cefd85a
 F ext/recover/recoverbuild.test c74170e0f7b02456af41838afeb5353fdb985a48cc2331d661bbabbca7c6b8e3
 F ext/recover/recoverclobber.test 3ba6c0c373c5c63d17e82eced64c05c57ccaf26c1abe1ca7141334022a79f32e
 F ext/recover/recovercorrupt.test 64c081ad1200ae77b447da99eb724785d6bf71715f394543dc7689642e92bf49
 F ext/recover/recovercorrupt2.test 1418f1710debc24ff38276cedfcea234beb37a34205708e7e3e6d76cc4a979db
+F ext/recover/recovercorrupt3.test 2e7b9a1b528ca23ed382cec6f64e3fcbbd0f8e852add7562397fd8df83f335d5
 F ext/recover/recoverfault.test 9d9f88eeb222615a25e7514f234c950d46bee20d24cd8db49d8fff8d650dcfe1
 F ext/recover/recoverfault2.test 730e7371bcda769554d15460cb23126abba1be8eca9539ccabf63623e7bb7e09
 F ext/recover/recoverold.test 68db3d6f85dd2b98e785b6c4da4f5eea4bbe52ccf6674d9a94c7506dc92596aa
@@ -2160,10 +2161,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 08dd2b927bf8fbda76b4ea07ca1827efa9bb0b68348683abfd19328c117dc405
-R c4d37ec4d4b175414d039c166b6f8ab8
-T +sym-release *
-T +sym-version-3.45.3 *
-U drh
-Z 024d96198ee99cc296e773820295fe65
+P 8653b758870e6ef0c98d46b3ace27849054af85da891eb121e9aaa537f1e8355
+Q +1c7e33a8aa0e6122b5ef606e4a7d95e8ecd9440216d4b099fe8f2a40653422be
+Q +8519b4d0393ed17eed06bceffbc891fe8cae0bc1d466a79eba0602ef46b07c56
+Q +8de85170d53e1d2a2abe14508a222377b9493e25f3174b8f0f773427deb8df26
+R 430233d8579bd1ffde420695ab0fdf43
+U dan
+Z abdfc367ed4e3013b0caa6a11fc70684
 # Remove this line to create a well-formed Fossil manifest.
index 1abea43b4f1d0d8d4dcbc2a639ed32d797cc8b0c..7a2865965783f6cfc3f0c13aec721c9f65abd958 100644 (file)
@@ -1 +1 @@
-8653b758870e6ef0c98d46b3ace27849054af85da891eb121e9aaa537f1e8355
\ No newline at end of file
+bc394acb6e6bcaccd17d8afe559d743799c0cb8d7aec709306181673a35dcb86
\ No newline at end of file