From: Andi Gutmans Date: Sun, 13 Feb 2000 12:45:36 +0000 (+0000) Subject: - Fix a couple of potential bugs where we were using emalloc/efree instead X-Git-Tag: BEFORE_SAPI_POST_PATCH_17_FEB_2000~57 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=920b7b2841232f270cf88b35ecd0a4b60fd733a0;p=php - Fix a couple of potential bugs where we were using emalloc/efree instead of pemalloc/pefree. - Fix a bug were we potentially would be freeing the key by mistake --- diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 2a750add64..3a34d39d58 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -128,6 +128,36 @@ ZEND_API ulong hashpjw(char *arKey, uint nKeyLength) } +#define UPDATE_DATA(ht, p, pData, nDataSize) \ + if (flag & HASH_ADD_PTR) { \ + if (!(p)->pDataPtr) { \ + pefree(p, (ht)->persistent); \ + } \ + (p)->pDataPtr = pData; \ + (p)->pData = &(p)->pDataPtr; \ + } else { \ + if ((p)->pDataPtr) { \ + (p)->pData = (void *) pemalloc(nDataSize, (ht)->persistent); \ + (p)->pDataPtr=NULL; \ + } \ + memcpy((p)->pData, pData, nDataSize); \ + } + +#define INIT_DATA(ht, p, pData, nDataSize); \ + if (flag & HASH_ADD_PTR) { \ + (p)->pDataPtr = pData; \ + (p)->pData = &(p)->pDataPtr; \ + } else { \ + (p)->pData = (void *) pemalloc(nDataSize, (ht)->persistent); \ + if (!(p)->pData) { \ + pefree(p, (ht)->persistent); \ + return FAILURE; \ + } \ + memcpy((p)->pData, pData, nDataSize); \ + (p)->pDataPtr=NULL; \ + } + + ZEND_API int zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, int persistent) { uint i; @@ -206,19 +236,7 @@ ZEND_API int zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength if (ht->pDestructor) { ht->pDestructor(p->pData); } - if (flag & HASH_ADD_PTR) { - if (!p->pDataPtr) { - efree(p->pData); - } - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - if (p->pDataPtr) { - p->pData = (void *) emalloc(nDataSize); - p->pDataPtr=NULL; - } - memcpy(p->pData, pData, nDataSize); - } + UPDATE_DATA(ht, p, pData, nDataSize); if (pDest) { *pDest = p->pData; } @@ -235,19 +253,7 @@ ZEND_API int zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength } memcpy(p->arKey, arKey, nKeyLength); p->nKeyLength = nKeyLength; - if (flag & HASH_ADD_PTR) { - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - p->pData = (void *) pemalloc(nDataSize, ht->persistent); - if (!p->pData) { - pefree(p, ht->persistent); - pefree(p->arKey, ht->persistent); - return FAILURE; - } - memcpy(p->pData, pData, nDataSize); - p->pDataPtr=NULL; - } + INIT_DATA(ht, p, pData, nDataSize); p->h = h; CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]); if (pDest) { @@ -298,19 +304,7 @@ ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKey if (ht->pDestructor) { ht->pDestructor(p->pData); } - if (flag & HASH_ADD_PTR) { - if (!p->pDataPtr) { - efree(p->pData); - } - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - if (p->pDataPtr) { - p->pData = (void *) emalloc(nDataSize); - p->pDataPtr=NULL; - } - memcpy(p->pData, pData, nDataSize); - } + UPDATE_DATA(ht, p, pData, nDataSize); if (pDest) { *pDest = p->pData; } @@ -328,20 +322,7 @@ ZEND_API int zend_hash_quick_add_or_update(HashTable *ht, char *arKey, uint nKey memcpy(p->arKey, arKey, nKeyLength); p->nKeyLength = nKeyLength; - if (flag & HASH_ADD_PTR) { - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - p->pData = (void *) pemalloc(nDataSize, ht->persistent); - if (!p->pData) { - pefree(p, ht->persistent); - pefree(p->arKey, ht->persistent); - return FAILURE; - } - - memcpy(p->pData, pData, nDataSize); - p->pDataPtr=NULL; - } + INIT_DATA(ht, p, pData, nDataSize); p->h = h; CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]); @@ -390,19 +371,7 @@ ZEND_API int zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void if (ht->pDestructor) { ht->pDestructor(p->pData); } - if (flag & HASH_ADD_PTR) { - if (!p->pDataPtr) { - efree(p->pData); - } - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - if (p->pDataPtr) { - p->pData = (void *) emalloc(nDataSize); - p->pDataPtr=NULL; - } - memcpy(p->pData, pData, nDataSize); - } + UPDATE_DATA(ht, p, pData, nDataSize); HANDLE_UNBLOCK_INTERRUPTIONS(); if (h >= ht->nNextFreeElement) { ht->nNextFreeElement = h + 1; @@ -420,19 +389,7 @@ ZEND_API int zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void } p->nKeyLength = 0; /* Numeric indices are marked by making the nKeyLength == 0 */ p->h = h; - - if (flag & HASH_ADD_PTR) { - p->pDataPtr = pData; - p->pData = &p->pDataPtr; - } else { - p->pData = (void *) pemalloc(nDataSize, ht->persistent); - if (!p->pData) { - pefree(p, ht->persistent); - return FAILURE; - } - memcpy(p->pData, pData, nDataSize); - p->pDataPtr=NULL; - } + INIT_DATA(ht, p, pData, nDataSize); if (pDest) { *pDest = p->pData; }