Index: third_party/sqlite/src/src/mem5.c |
diff --git a/third_party/sqlite/src/src/mem5.c b/third_party/sqlite/src/src/mem5.c |
index 783cef6176c59cbf30914631095a1a54f4e42e08..1479ddd0d09d69dad6780d40abeebb22bcfa0f67 100644 |
--- a/third_party/sqlite/src/src/mem5.c |
+++ b/third_party/sqlite/src/src/mem5.c |
@@ -28,7 +28,7 @@ |
** 1. All memory allocations sizes are rounded up to a power of 2. |
** |
** 2. If two adjacent free blocks are the halves of a larger block, |
-** then the two blocks are coalesed into the single larger block. |
+** then the two blocks are coalesced into the single larger block. |
** |
** 3. New memory is allocated from the first available free block. |
** |
@@ -130,13 +130,13 @@ static SQLITE_WSD struct Mem5Global { |
} mem5; |
/* |
-** Access the static variable through a macro for SQLITE_OMIT_WSD |
+** Access the static variable through a macro for SQLITE_OMIT_WSD. |
*/ |
#define mem5 GLOBAL(struct Mem5Global, mem5) |
/* |
** Assuming mem5.zPool is divided up into an array of Mem5Link |
-** structures, return a pointer to the idx-th such lik. |
+** structures, return a pointer to the idx-th such link. |
*/ |
#define MEM5LINK(idx) ((Mem5Link *)(&mem5.zPool[(idx)*mem5.szAtom])) |
@@ -202,7 +202,7 @@ static void memsys5Leave(void){ |
static int memsys5Size(void *p){ |
int iSize = 0; |
if( p ){ |
- int i = ((u8 *)p-mem5.zPool)/mem5.szAtom; |
+ int i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); |
assert( i>=0 && i<mem5.nBlock ); |
iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE)); |
} |
@@ -210,29 +210,10 @@ static int memsys5Size(void *p){ |
} |
/* |
-** Find the first entry on the freelist iLogsize. Unlink that |
-** entry and return its index. |
-*/ |
-static int memsys5UnlinkFirst(int iLogsize){ |
- int i; |
- int iFirst; |
- |
- assert( iLogsize>=0 && iLogsize<=LOGMAX ); |
- i = iFirst = mem5.aiFreelist[iLogsize]; |
- assert( iFirst>=0 ); |
- while( i>0 ){ |
- if( i<iFirst ) iFirst = i; |
- i = MEM5LINK(i)->next; |
- } |
- memsys5Unlink(iFirst, iLogsize); |
- return iFirst; |
-} |
- |
-/* |
** Return a block of memory of at least nBytes in size. |
** Return NULL if unable. Return NULL if nBytes==0. |
** |
-** The caller guarantees that nByte positive. |
+** The caller guarantees that nByte is positive. |
** |
** The caller has obtained a mutex prior to invoking this |
** routine so there is never any chance that two or more |
@@ -267,13 +248,14 @@ static void *memsys5MallocUnsafe(int nByte){ |
** block. If not, then split a block of the next larger power of |
** two in order to create a new free block of size iLogsize. |
*/ |
- for(iBin=iLogsize; mem5.aiFreelist[iBin]<0 && iBin<=LOGMAX; iBin++){} |
+ for(iBin=iLogsize; iBin<=LOGMAX && mem5.aiFreelist[iBin]<0; iBin++){} |
if( iBin>LOGMAX ){ |
testcase( sqlite3GlobalConfig.xLog!=0 ); |
sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes", nByte); |
return 0; |
} |
- i = memsys5UnlinkFirst(iBin); |
+ i = mem5.aiFreelist[iBin]; |
+ memsys5Unlink(i, iBin); |
while( iBin>iLogsize ){ |
int newSize; |
@@ -293,6 +275,12 @@ static void *memsys5MallocUnsafe(int nByte){ |
if( mem5.maxCount<mem5.currentCount ) mem5.maxCount = mem5.currentCount; |
if( mem5.maxOut<mem5.currentOut ) mem5.maxOut = mem5.currentOut; |
+#ifdef SQLITE_DEBUG |
+ /* Make sure the allocated memory does not assume that it is set to zero |
+ ** or retains a value from a previous allocation */ |
+ memset(&mem5.zPool[i*mem5.szAtom], 0xAA, iFullSz); |
+#endif |
+ |
/* Return a pointer to the allocated memory. */ |
return (void*)&mem5.zPool[i*mem5.szAtom]; |
} |
@@ -307,7 +295,7 @@ static void memsys5FreeUnsafe(void *pOld){ |
/* Set iBlock to the index of the block pointed to by pOld in |
** the array of mem5.szAtom byte blocks pointed to by mem5.zPool. |
*/ |
- iBlock = ((u8 *)pOld-mem5.zPool)/mem5.szAtom; |
+ iBlock = (int)(((u8 *)pOld-mem5.zPool)/mem5.szAtom); |
/* Check that the pointer pOld points to a valid, non-free block. */ |
assert( iBlock>=0 && iBlock<mem5.nBlock ); |
@@ -350,11 +338,18 @@ static void memsys5FreeUnsafe(void *pOld){ |
} |
size *= 2; |
} |
+ |
+#ifdef SQLITE_DEBUG |
+ /* Overwrite freed memory with the 0x55 bit pattern to verify that it is |
+ ** not used after being freed */ |
+ memset(&mem5.zPool[iBlock*mem5.szAtom], 0x55, size); |
+#endif |
+ |
memsys5Link(iBlock, iLogsize); |
} |
/* |
-** Allocate nBytes of memory |
+** Allocate nBytes of memory. |
*/ |
static void *memsys5Malloc(int nBytes){ |
sqlite3_int64 *p = 0; |