aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2025-06-10 19:52:21 +0000
committerdrh <>2025-06-10 19:52:21 +0000
commita09a4fbac958ab3c130c73500cc3cf68f9151d50 (patch)
treee69c3aa591a4fadcd75cad7bc8ad57022f3e24ce /src
parent6a23ff5a07ac3903e1f6dd8f06345fdc394e23ff (diff)
downloadsqlite-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.c4
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]);