diff options
author | drh <> | 2025-06-10 19:52:21 +0000 |
---|---|---|
committer | drh <> | 2025-06-10 19:52:21 +0000 |
commit | a09a4fbac958ab3c130c73500cc3cf68f9151d50 (patch) | |
tree | e69c3aa591a4fadcd75cad7bc8ad57022f3e24ce /src | |
parent | 6a23ff5a07ac3903e1f6dd8f06345fdc394e23ff (diff) | |
download | sqlite-a09a4fbac958ab3c130c73500cc3cf68f9151d50.tar.gz sqlite-a09a4fbac958ab3c130c73500cc3cf68f9151d50.zip |
Improved selection of the divisor when subdividing nested Bitvec objects.
This fixes a potential stack overflow that can occur when the database size
is within 60 pages of the maximum allowed by the file format.
FossilOrigin-Name: f7ab764ed9df6d7a4a96cb0933d291f00174f33fed3d9951785078fe225adcb7
Diffstat (limited to 'src')
-rw-r--r-- | src/bitvec.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/bitvec.c b/src/bitvec.c index 70be555bb..7c5fa71d9 100644 --- a/src/bitvec.c +++ b/src/bitvec.c @@ -217,7 +217,9 @@ bitvec_set_rehash: }else{ memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); memset(p->u.apSub, 0, sizeof(p->u.apSub)); - p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR; + p->iDivisor = p->iSize/BITVEC_NPTR; + if( (p->iSize%BITVEC_NPTR)!=0 ) p->iDivisor++; + if( p->iDivisor<BITVEC_NBIT ) p->iDivisor = BITVEC_NBIT; rc = sqlite3BitvecSet(p, i); for(j=0; j<BITVEC_NINT; j++){ if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]); |