aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <Dan Kennedy>2024-07-13 16:53:56 +0000
committerdan <Dan Kennedy>2024-07-13 16:53:56 +0000
commit7acf972c5946fb95d510ecc18f46f9a8b5d1cbd5 (patch)
tree7ef8712a7e3a67559256ba80a30714255eb46590 /src
parent0b9efaffd7eaf7881196b9d443670809f949be60 (diff)
downloadsqlite-7acf972c5946fb95d510ecc18f46f9a8b5d1cbd5.tar.gz
sqlite-7acf972c5946fb95d510ecc18f46f9a8b5d1cbd5.zip
Fixes for platforms with 32-bit pointers that require 64-bit values to be aligned.
FossilOrigin-Name: 2212d7488ed4ec2839ffa45cb9567056b36519434834634e4ecc441c330694d7
Diffstat (limited to 'src')
-rw-r--r--src/pcache1.c4
-rw-r--r--src/test_pcache.c3
-rw-r--r--src/vdbe.c18
3 files changed, 18 insertions, 7 deletions
diff --git a/src/pcache1.c b/src/pcache1.c
index 1591f014c..a1f8a1dbb 100644
--- a/src/pcache1.c
+++ b/src/pcache1.c
@@ -320,7 +320,7 @@ static int pcache1InitBulk(PCache1 *pCache){
do{
PgHdr1 *pX = (PgHdr1*)&zBulk[pCache->szPage];
pX->page.pBuf = zBulk;
- pX->page.pExtra = &pX[1];
+ pX->page.pExtra = (u8*)pX + ROUND8(sizeof(*pX));
pX->isBulkLocal = 1;
pX->isAnchor = 0;
pX->pNext = pCache->pFree;
@@ -457,7 +457,7 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){
if( pPg==0 ) return 0;
p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage];
p->page.pBuf = pPg;
- p->page.pExtra = &p[1];
+ p->page.pExtra = (u8*)p + ROUND8(sizeof(*p));
p->isBulkLocal = 0;
p->isAnchor = 0;
p->pLruPrev = 0; /* Initializing this saves a valgrind error */
diff --git a/src/test_pcache.c b/src/test_pcache.c
index 5266d6769..ceefa13e5 100644
--- a/src/test_pcache.c
+++ b/src/test_pcache.c
@@ -99,7 +99,7 @@ static void testpcacheShutdown(void *pArg){
*/
typedef struct testpcache testpcache;
struct testpcache {
- int szPage; /* Size of each page. Multiple of 8. */
+ sqlite3_int64 szPage; /* Size of each page. Multiple of 8. */
int szExtra; /* Size of extra data that accompanies each page */
int bPurgeable; /* True if the page cache is purgeable */
int nFree; /* Number of unused slots in a[] */
@@ -141,6 +141,7 @@ static sqlite3_pcache *testpcacheCreate(
int i;
assert( testpcacheGlobal.pDummy!=0 );
szPage = (szPage+7)&~7;
+ szExtra = (szPage+7)&~7;
nMem = sizeof(testpcache) + TESTPCACHE_NPAGE*(szPage+szExtra);
p = sqlite3_malloc( nMem );
if( p==0 ) return 0;
diff --git a/src/vdbe.c b/src/vdbe.c
index 4ece26d03..79368fd06 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -7671,18 +7671,28 @@ case OP_AggInverse:
case OP_AggStep: {
int n;
sqlite3_context *pCtx;
+ u64 nAlloc;
assert( pOp->p4type==P4_FUNCDEF );
n = pOp->p5;
assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) );
assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) );
assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
- pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) +
- (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*)));
+
+ /* Allocate space for (a) the context object and (n-1) extra pointers
+ ** to append to the sqlite3_context.argv[1] array, and (b) a memory
+ ** cell in which to store the accumulation. Be careful that the memory
+ ** cell is 8-byte aligned, even on platforms where a pointer is 32-bits.
+ **
+ ** Note: We could avoid this by using a regular memory cell from aMem[] for
+ ** the accumulator, instead of allocating one here. */
+ nAlloc = ROUND8P( sizeof(pCtx[0]) + (n-1)*sizeof(sqlite3_value*) );
+ pCtx = sqlite3DbMallocRawNN(db, nAlloc + sizeof(Mem));
if( pCtx==0 ) goto no_mem;
- pCtx->pMem = 0;
- pCtx->pOut = (Mem*)&(pCtx->argv[n]);
+ pCtx->pOut = (Mem*)((u8*)pCtx + nAlloc);
+
sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null);
+ pCtx->pMem = 0;
pCtx->pFunc = pOp->p4.pFunc;
pCtx->iOp = (int)(pOp - aOp);
pCtx->pVdbe = p;