1
0
mirror of https://github.com/php/php-src.git synced 2026-04-19 22:11:12 +02:00

- 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
This commit is contained in:
Andi Gutmans
2000-02-13 12:45:36 +00:00
parent 9d4e4545fe
commit 920b7b2841

View File

@@ -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;
}