From: dan Date: Tue, 1 Feb 2011 17:55:48 +0000 (+0000) Subject: Fix a case in fts4 where a corrupt %_stat table could lead to a crash. X-Git-Tag: version-3.7.6~175^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0bfda98155835027a6c28d369f2cf056a8ffc0ef;p=thirdparty%2Fsqlite.git Fix a case in fts4 where a corrupt %_stat table could lead to a crash. FossilOrigin-Name: 4ade96ce974244fc34bb97713d3cba10e3d33056 --- diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index acf1786819..54371db1c8 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -960,6 +960,7 @@ static int fts3MatchinfoSelectDoctotal( a = sqlite3_column_blob(pStmt, 0); a += sqlite3Fts3GetVarint(a, &nDoc); + if( nDoc==0 ) return SQLITE_CORRUPT; *pnDoc = (u32)nDoc; if( paLen ) *paLen = a; @@ -1166,9 +1167,11 @@ static int fts3MatchinfoValues( if( rc==SQLITE_OK ){ int iCol; for(iCol=0; iColnCol; iCol++){ + u32 iVal; sqlite3_int64 nToken; a += sqlite3Fts3GetVarint(a, &nToken); - pInfo->aMatchinfo[iCol] = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); + iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc); + pInfo->aMatchinfo[iCol] = iVal; } } } diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 8197ce3f5a..00b389d88f 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -289,7 +289,7 @@ static int fts3SelectDocsize( sqlite3_bind_int64(pStmt, 1, iDocid); } rc = sqlite3_step(pStmt); - if( rc!=SQLITE_ROW ){ + if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){ rc = sqlite3_reset(pStmt); if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT; pStmt = 0; @@ -1102,16 +1102,18 @@ int sqlite3Fts3SegReaderCost( sqlite3_stmt *pStmt; sqlite3_int64 nDoc = 0; sqlite3_int64 nByte = 0; + const char *pEnd; const char *a; + rc = sqlite3Fts3SelectDoctotal(p, &pStmt); - if( rc ) return rc; + if( rc!=SQLITE_OK ) return rc; a = sqlite3_column_blob(pStmt, 0); - if( a ){ - const char *pEnd = &a[sqlite3_column_bytes(pStmt, 0)]; - a += sqlite3Fts3GetVarint(a, &nDoc); - while( a