aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/btree.c14
-rw-r--r--src/btreeInt.h13
-rw-r--r--src/util.c7
3 files changed, 20 insertions, 14 deletions
diff --git a/src/btree.c b/src/btree.c
index ef2a86152..fe2c067db 100644
--- a/src/btree.c
+++ b/src/btree.c
@@ -971,9 +971,9 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){
** This routine works only for pages that do not contain overflow cells.
*/
#define findCell(P,I) \
- ((P)->aData + ((P)->maskPage & get2byte(&(P)->aCellIdx[2*(I)])))
+ ((P)->aData + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)])))
#define findCellPastPtr(P,I) \
- ((P)->aDataOfst + ((P)->maskPage & get2byte(&(P)->aCellIdx[2*(I)])))
+ ((P)->aDataOfst + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)])))
/*
@@ -1754,7 +1754,7 @@ static int btreeInitPage(MemPage *pPage){
if( !pPage->leaf ) iCellLast--;
for(i=0; i<pPage->nCell; i++){
- pc = get2byte(&data[cellOffset+i*2]);
+ pc = get2byteAligned(&data[cellOffset+i*2]);
testcase( pc==iCellFirst );
testcase( pc==iCellLast );
if( pc<iCellFirst || pc>iCellLast ){
@@ -6625,7 +6625,7 @@ static int editPage(
#ifdef SQLITE_DEBUG
for(i=0; i<nNew && !CORRUPT_DB; i++){
u8 *pCell = pCArray->apCell[i+iNew];
- int iOff = get2byte(&pPg->aCellIdx[i*2]);
+ int iOff = get2byteAligned(&pPg->aCellIdx[i*2]);
if( pCell>=aData && pCell<&aData[pPg->pBt->usableSize] ){
pCell = &pTmp[pCell - aData];
}
@@ -7127,7 +7127,7 @@ static int balance_nonroot(
memset(&b.szCell[b.nCell+limit], 0, sizeof(b.szCell[0])*pOld->nOverflow);
limit = pOld->aiOvfl[0];
for(j=0; j<limit; j++){
- b.apCell[b.nCell] = aData + (maskPage & get2byte(piCell));
+ b.apCell[b.nCell] = aData + (maskPage & get2byteAligned(piCell));
piCell += 2;
b.nCell++;
}
@@ -7140,7 +7140,7 @@ static int balance_nonroot(
piEnd = aData + pOld->cellOffset + 2*pOld->nCell;
while( piCell<piEnd ){
assert( b.nCell<nMaxCells );
- b.apCell[b.nCell] = aData + (maskPage & get2byte(piCell));
+ b.apCell[b.nCell] = aData + (maskPage & get2byteAligned(piCell));
piCell += 2;
b.nCell++;
}
@@ -9105,7 +9105,7 @@ static int checkTreePage(
/* EVIDENCE-OF: R-02776-14802 The cell pointer array consists of K 2-byte
** integer offsets to the cell contents. */
for(i=0; i<nCell; i++){
- int pc = get2byte(&data[cellStart+i*2]);
+ int pc = get2byteAligned(&data[cellStart+i*2]);
u32 size = 65536;
if( pc<=usableSize-4 ){
size = pPage->xCellSize(pPage, &data[pc]);
diff --git a/src/btreeInt.h b/src/btreeInt.h
index 92a4d4469..1ccdb0839 100644
--- a/src/btreeInt.h
+++ b/src/btreeInt.h
@@ -691,3 +691,16 @@ struct IntegrityCk {
#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v))
#define get4byte sqlite3Get4byte
#define put4byte sqlite3Put4byte
+
+/*
+** get2byteAligned(), unlike get2byte(), requires that its argument point to a
+** two-byte aligned address. get2bytea() is only used for accessing the
+** cell addresses in a btree header.
+*/
+#if SQLITE_BYTEORDER==4321
+# define get2byteAligned(x) (*(u16*)(x))
+#elif SQLITE_BYTEORDER==1234 && defined(__GNUC__)
+# define get2byteAligned(x) __builtin_bswap16(*(u16*)(x))
+#else
+# define get2byteAligned(x) ((x)[0]<<8 | (x)[1])
+#endif
diff --git a/src/util.c b/src/util.c
index f2d3e91e7..4e029b0e0 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1082,10 +1082,6 @@ u32 sqlite3Get4byte(const u8 *p){
u32 x;
memcpy(&x,p,4);
return x;
-#elif defined(_MSC_VER)
- u32 x;
- memcpy(&x,p,4);
- return htonl(x);
#elif SQLITE_BYTEORDER==1234 && defined(__GNUC__)
u32 x;
memcpy(&x,p,4);
@@ -1098,9 +1094,6 @@ u32 sqlite3Get4byte(const u8 *p){
void sqlite3Put4byte(unsigned char *p, u32 v){
#if SQLITE_BYTEORDER==4321
memcpy(p,&v,4);
-#elif defined(_MSC_VER)
- u32 x = htonl(v);
- memcpy(&x,p,4);
#elif SQLITE_BYTEORDER==1234 && defined(__GNUC__)
u32 x = __builtin_bswap32(v);
memcpy(p,&x,4);