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:
@ -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);
|
||||||
|
14
manifest
14
manifest
@ -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
|
||||||
|
@ -1 +1 @@
|
|||||||
6af4e6d054efd8445e1010aabd584f36e70dfad0de13bd0e2f1761cad4d9a7d6
|
4cc09a872f627f4a2b94345bef07cd49c3ec3627f8d78c1eb091741cdb4ec0b3
|
Reference in New Issue
Block a user