Index: mm.c =================================================================== --- mm.c (revision 325) +++ mm.c (working copy) @@ -66,6 +66,9 @@ # endif #endif +#define MM_CHECK 1 +#define MM_PATTERN 0xdeadbeef + #if defined(MM_SHM_MMAP_FILE) || defined(MM_SHM_MMAP_ZERO) || defined(MM_SHM_MMAP_ANON) || defined(MM_SHM_MMAP_POSIX) || defined(HAVE_MPROTECT) # include #endif @@ -1065,6 +1068,9 @@ if (size > 0) { mm_mem_head* x = NULL; size_t realsize = (size_t)MM_ALIGN(MM_SIZE(size)); +#if MM_CHECK + realsize += (size_t)MM_ALIGN(sizeof(int)); +#endif if (realsize <= mm->available) { /* Search for free bucket */ mm_free_bucket* p = mm->free_list; @@ -1083,7 +1089,7 @@ } break; } else if (p->size > realsize && (best == NULL || best->size > p->size)) { - /* Found best bucket (smallest bucket with the grater size) */ + /* Found best bucket (smallest bucket with the bigger size) */ best = p; best_prev = q; } @@ -1118,6 +1124,9 @@ } } if (x != NULL) { +#ifdef MM_CHECK + *(int *)((char *)x + realsize - (size_t)MM_ALIGN(sizeof(int))) = MM_PATTERN; +#endif return HEAD_TO_PTR(x); } } @@ -1318,6 +1327,17 @@ return 0; } +#if defined(MM_CHECK) && !(defined(MM_TEST_SHM) || defined(MM_TEST_SEM)) +void mm_check_mem(void *x) { + mm_mem_head *p = PTR_TO_HEAD(x); + if (*((unsigned int *)((char *)p + p->size - (size_t)MM_ALIGN(sizeof(int)))) != MM_PATTERN) { + ea_debug_error("[EACCELERATOR] Corrupted memory detected\n"); + } +} +#else +void mm_check_mem(void *x) {} +#endif + #ifdef MM_TEST_SHM int main() { char key[] = "/tmp/mm"; Index: mm.h =================================================================== --- mm.h (revision 325) +++ mm.h (working copy) @@ -66,6 +66,7 @@ const char* mm_shm_type(); const char* mm_sem_type(); +void mm_check_mem(void *x); #define MM_PROT_NONE 1 #define MM_PROT_READ 2 Index: eaccelerator.c =================================================================== --- eaccelerator.c (revision 325) +++ eaccelerator.c (working copy) @@ -748,6 +748,7 @@ p->use_cnt = 0; p->removed = 1; } + mm_check_mem(p); return p; } return NULL; @@ -799,6 +800,7 @@ int use_shm = 1; int ret = 0; int size = 0; + void *data = NULL; zend_try { size = calc_size(key, op_array, f, c TSRMLS_CC); @@ -814,6 +816,7 @@ EACCELERATOR_UNPROTECT(); EAG(mem) = eaccelerator_malloc(size); + data = EAG(mem); if (EAG(mem) == NULL) { EAG(mem) = eaccelerator_malloc2(size TSRMLS_CC); } @@ -845,6 +848,7 @@ hash_add_mm(p); EACCELERATOR_PROTECT(); ret = 1; + mm_check_mem(data); } else { ret = hash_add_file(p TSRMLS_CC); efree(p);