diff options
author | drh <drh@noemail.net> | 2015-04-15 17:26:55 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2015-04-15 17:26:55 +0000 |
commit | f3392e32c7f76f6e28b6b1fc78119b278fbfdbc9 (patch) | |
tree | 7b8f7fe24d60a3caec6f8555686886692f856967 /src/btree.c | |
parent | 748c7357ab3906c8a70c4fa53f247560c13c3411 (diff) | |
download | sqlite-f3392e32c7f76f6e28b6b1fc78119b278fbfdbc9.tar.gz sqlite-f3392e32c7f76f6e28b6b1fc78119b278fbfdbc9.zip |
Prevent the fetchPayload() routine from reporting a cell size that extends
off the end of the page on a pathologically corrupted database file.
FossilOrigin-Name: f71053cf658b3260a32ac06f8ba5c2cde0ea54dd
Diffstat (limited to 'src/btree.c')
-rw-r--r-- | src/btree.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/btree.c b/src/btree.c index 9faf62423..51fca4b4b 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4451,13 +4451,18 @@ static const void *fetchPayload( BtCursor *pCur, /* Cursor pointing to entry to read from */ u32 *pAmt /* Write the number of available bytes here */ ){ + u32 amt; assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]); assert( pCur->eState==CURSOR_VALID ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); assert( cursorHoldsMutex(pCur) ); assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell ); assert( pCur->info.nSize>0 ); - *pAmt = pCur->info.nLocal; + assert( pCur->info.pPayload>pCur->apPage[pCur->iPage]->aData || CORRUPT_DB ); + assert( pCur->info.pPayload<pCur->apPage[pCur->iPage]->aDataEnd ||CORRUPT_DB); + amt = (int)(pCur->apPage[pCur->iPage]->aDataEnd - pCur->info.pPayload); + if( pCur->info.nLocal<amt ) amt = pCur->info.nLocal; + *pAmt = amt; return (void*)pCur->info.pPayload; } |