1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Avoid signed integer overflow when finding snippets in fts3 by using 64-bit integer offsets.

FossilOrigin-Name: 4cc09a872f627f4a2b94345bef07cd49c3ec3627f8d78c1eb091741cdb4ec0b3
This commit is contained in:
dan
2021-04-16 16:55:28 +00:00
parent 197561cd42
commit 7f2eb8fff2
3 changed files with 22 additions and 18 deletions

View File

@ -17,6 +17,10 @@
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#ifndef SQLITE_AMALGAMATION
typedef sqlite3_int64 i64;
#endif
/* /*
** Characters that may appear in the second argument to matchinfo(). ** Characters that may appear in the second argument to matchinfo().
*/ */
@ -67,9 +71,9 @@ struct SnippetIter {
struct SnippetPhrase { struct SnippetPhrase {
int nToken; /* Number of tokens in phrase */ int nToken; /* Number of tokens in phrase */
char *pList; /* Pointer to start of phrase position list */ char *pList; /* Pointer to start of phrase position list */
int iHead; /* Next value in position list */ i64 iHead; /* Next value in position list */
char *pHead; /* Position list data following iHead */ char *pHead; /* Position list data following iHead */
int iTail; /* Next value in trailing position list */ i64 iTail; /* Next value in trailing position list */
char *pTail; /* Position list data following iTail */ char *pTail; /* Position list data following iTail */
}; };
@ -234,7 +238,7 @@ void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){
** After it returns, *piPos contains the value of the next element of the ** After it returns, *piPos contains the value of the next element of the
** list and *pp is advanced to the following varint. ** list and *pp is advanced to the following varint.
*/ */
static void fts3GetDeltaPosition(char **pp, int *piPos){ static void fts3GetDeltaPosition(char **pp, i64 *piPos){
int iVal; int iVal;
*pp += fts3GetVarint32(*pp, &iVal); *pp += fts3GetVarint32(*pp, &iVal);
*piPos += (iVal-2); *piPos += (iVal-2);
@ -343,10 +347,10 @@ static int fts3ExprPhraseCount(Fts3Expr *pExpr){
** arguments so that it points to the first element with a value greater ** arguments so that it points to the first element with a value greater
** than or equal to parameter iNext. ** than or equal to parameter iNext.
*/ */
static void fts3SnippetAdvance(char **ppIter, int *piIter, int iNext){ static void fts3SnippetAdvance(char **ppIter, i64 *piIter, int iNext){
char *pIter = *ppIter; char *pIter = *ppIter;
if( pIter ){ if( pIter ){
int iIter = *piIter; i64 iIter = *piIter;
while( iIter<iNext ){ while( iIter<iNext ){
if( 0==(*pIter & 0xFE) ){ if( 0==(*pIter & 0xFE) ){
@ -429,7 +433,7 @@ static void fts3SnippetDetails(
SnippetPhrase *pPhrase = &pIter->aPhrase[i]; SnippetPhrase *pPhrase = &pIter->aPhrase[i];
if( pPhrase->pTail ){ if( pPhrase->pTail ){
char *pCsr = pPhrase->pTail; char *pCsr = pPhrase->pTail;
int iCsr = pPhrase->iTail; i64 iCsr = pPhrase->iTail;
while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){
int j; int j;
@ -475,7 +479,7 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){
rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pCsr); rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pCsr);
assert( rc==SQLITE_OK || pCsr==0 ); assert( rc==SQLITE_OK || pCsr==0 );
if( pCsr ){ if( pCsr ){
int iFirst = 0; i64 iFirst = 0;
pPhrase->pList = pCsr; pPhrase->pList = pCsr;
fts3GetDeltaPosition(&pCsr, &iFirst); fts3GetDeltaPosition(&pCsr, &iFirst);
if( iFirst<0 ){ if( iFirst<0 ){
@ -1539,8 +1543,8 @@ typedef struct TermOffsetCtx TermOffsetCtx;
struct TermOffset { struct TermOffset {
char *pList; /* Position-list */ char *pList; /* Position-list */
int iPos; /* Position just read from pList */ i64 iPos; /* Position just read from pList */
int iOff; /* Offset of this term from read positions */ i64 iOff; /* Offset of this term from read positions */
}; };
struct TermOffsetCtx { struct TermOffsetCtx {
@ -1559,7 +1563,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){
int nTerm; /* Number of tokens in phrase */ int nTerm; /* Number of tokens in phrase */
int iTerm; /* For looping through nTerm phrase terms */ int iTerm; /* For looping through nTerm phrase terms */
char *pList; /* Pointer to position list for phrase */ char *pList; /* Pointer to position list for phrase */
int iPos = 0; /* First position in position-list */ i64 iPos = 0; /* First position in position-list */
int rc; int rc;
UNUSED_PARAMETER(iPhrase); UNUSED_PARAMETER(iPhrase);

View File

@ -1,5 +1,5 @@
C Remove\san\sALWAYS()\sfrom\sa\sbranch\sin\ssqlite3ExprAddCollateToken()\swhich\scan\nbe\sfalse\sfollowing\san\sOOM.\ndbsqlfuzz\s9e8516bf1e786c84e520ae43141b75b7399f8618. C Avoid\ssigned\sinteger\soverflow\swhen\sfinding\ssnippets\sin\sfts3\sby\susing\s64-bit\sinteger\soffsets.
D 2021-04-16T12:33:52.638 D 2021-04-16T16:55:28.621
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -93,7 +93,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6
F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116
F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009
F ext/fts3/fts3_snippet.c 86e7e947a176f0f005720b3ca17631aca2fd2f9daa6729d4adbf2d16ab1b9613 F ext/fts3/fts3_snippet.c 57e1965906f3ecfcb5251a14aea98ac2d2dd1868a123bcd5a569601719ab9ead
F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1
F ext/fts3/fts3_test.c d8d7b2734f894e8a489987447658e374cdd3a3bc8575c401decf1911cb7c6454 F ext/fts3/fts3_test.c d8d7b2734f894e8a489987447658e374cdd3a3bc8575c401decf1911cb7c6454
F ext/fts3/fts3_tokenize_vtab.c 8d15b148e7d88a4280389a200b26e8d52abda4c4ec2e9a35e9d7a1fa50e5aa03 F ext/fts3/fts3_tokenize_vtab.c 8d15b148e7d88a4280389a200b26e8d52abda4c4ec2e9a35e9d7a1fa50e5aa03
@ -1912,7 +1912,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 5cb40e53edcb1e54cde0e54c38a647144bc3158435df0161f95c89732de086e6 P 6af4e6d054efd8445e1010aabd584f36e70dfad0de13bd0e2f1761cad4d9a7d6
R ddfb443f324f92c0f7d01464d567a778 R bb2fc97da9924027621d054c5f109d3c
U drh U dan
Z 4128704ba35132d25cf1033fb5faf21a Z d63dd194e7fabc0d0616c3cb1802e30f

View File

@ -1 +1 @@
6af4e6d054efd8445e1010aabd584f36e70dfad0de13bd0e2f1761cad4d9a7d6 4cc09a872f627f4a2b94345bef07cd49c3ec3627f8d78c1eb091741cdb4ec0b3