@@ -1174,7 +1174,8 @@ static void *_zend_mm_alloc_int(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D
1174
1174
size_t remaining_size = block_size - true_size ;
1175
1175
1176
1176
if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE ) {
1177
- ZEND_MM_BLOCK (best_fit , ZEND_MM_USED_BLOCK , block_size );
1177
+ true_size = block_size ;
1178
+ ZEND_MM_BLOCK (best_fit , ZEND_MM_USED_BLOCK , true_size );
1178
1179
} else {
1179
1180
zend_mm_free_block * new_free_block ;
1180
1181
@@ -1252,7 +1253,8 @@ static void *_zend_mm_alloc_int(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D
1252
1253
ZEND_MM_LAST_BLOCK (ZEND_MM_BLOCK_AT (best_fit , block_size ));
1253
1254
1254
1255
if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE ) {
1255
- ZEND_MM_BLOCK (best_fit , ZEND_MM_USED_BLOCK , block_size );
1256
+ true_size = block_size ;
1257
+ ZEND_MM_BLOCK (best_fit , ZEND_MM_USED_BLOCK , true_size );
1256
1258
} else {
1257
1259
zend_mm_free_block * new_free_block ;
1258
1260
@@ -1391,23 +1393,18 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1391
1393
zend_mm_block * mm_block = ZEND_MM_HEADER_OF (p );
1392
1394
zend_mm_block * next_block ;
1393
1395
size_t true_size ;
1396
+ size_t orig_size ;
1394
1397
void * ptr ;
1395
1398
1396
1399
if (!p || !ZEND_MM_VALID_PTR (p )) {
1397
1400
return _zend_mm_alloc_int (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1398
1401
}
1399
1402
mm_block = ZEND_MM_HEADER_OF (p );
1400
1403
true_size = ZEND_MM_TRUE_SIZE (size );
1401
-
1402
- #if MEMORY_LIMIT
1403
- heap -> size = heap -> size + true_size - ZEND_MM_BLOCK_SIZE (mm_block );
1404
- if (heap -> peak < heap -> size ) {
1405
- heap -> peak = heap -> size ;
1406
- }
1407
- #endif
1404
+ orig_size = ZEND_MM_BLOCK_SIZE (mm_block );
1408
1405
1409
- if (true_size <= ZEND_MM_BLOCK_SIZE ( mm_block ) ) {
1410
- size_t remaining_size = ZEND_MM_BLOCK_SIZE ( mm_block ) - true_size ;
1406
+ if (true_size <= orig_size ) {
1407
+ size_t remaining_size = orig_size - true_size ;
1411
1408
1412
1409
if (remaining_size >= ZEND_MM_ALIGNED_MIN_HEADER_SIZE ) {
1413
1410
zend_mm_free_block * new_free_block ;
@@ -1427,6 +1424,9 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1427
1424
1428
1425
/* add the new free block to the free list */
1429
1426
zend_mm_add_to_free_list (heap , new_free_block );
1427
+ #if MEMORY_LIMIT
1428
+ heap -> size += (true_size - orig_size );
1429
+ #endif
1430
1430
HANDLE_UNBLOCK_INTERRUPTIONS ();
1431
1431
}
1432
1432
#if ZEND_DEBUG
@@ -1443,14 +1443,15 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1443
1443
next_block = ZEND_MM_NEXT_BLOCK (mm_block );
1444
1444
1445
1445
if (ZEND_MM_IS_FREE_BLOCK (next_block )) {
1446
- if (ZEND_MM_BLOCK_SIZE ( mm_block ) + ZEND_MM_FREE_BLOCK_SIZE (next_block ) >= true_size ) {
1447
- size_t block_size = ZEND_MM_BLOCK_SIZE ( mm_block ) + ZEND_MM_FREE_BLOCK_SIZE (next_block );
1446
+ if (orig_size + ZEND_MM_FREE_BLOCK_SIZE (next_block ) >= true_size ) {
1447
+ size_t block_size = orig_size + ZEND_MM_FREE_BLOCK_SIZE (next_block );
1448
1448
size_t remaining_size = block_size - true_size ;
1449
1449
1450
1450
HANDLE_BLOCK_INTERRUPTIONS ();
1451
1451
zend_mm_remove_from_free_list (heap , (zend_mm_free_block * ) next_block );
1452
1452
1453
1453
if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE ) {
1454
+ true_size = block_size ;
1454
1455
ZEND_MM_BLOCK (mm_block , ZEND_MM_USED_BLOCK , block_size );
1455
1456
} else {
1456
1457
zend_mm_free_block * new_free_block ;
@@ -1470,6 +1471,12 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1470
1471
mm_block -> debug .orig_filename = __zend_orig_filename ;
1471
1472
mm_block -> debug .orig_lineno = __zend_orig_lineno ;
1472
1473
ZEND_MM_SET_END_MAGIC (mm_block );
1474
+ #endif
1475
+ #if MEMORY_LIMIT
1476
+ heap -> size = heap -> size + true_size - orig_size ;
1477
+ if (heap -> peak < heap -> size ) {
1478
+ heap -> peak = heap -> size ;
1479
+ }
1473
1480
#endif
1474
1481
HANDLE_UNBLOCK_INTERRUPTIONS ();
1475
1482
return p ;
@@ -1551,7 +1558,8 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1551
1558
ZEND_MM_LAST_BLOCK (ZEND_MM_BLOCK_AT (mm_block , block_size ));
1552
1559
1553
1560
if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE ) {
1554
- ZEND_MM_BLOCK (mm_block , ZEND_MM_USED_BLOCK , block_size );
1561
+ true_size = block_size ;
1562
+ ZEND_MM_BLOCK (mm_block , ZEND_MM_USED_BLOCK , true_size );
1555
1563
} else {
1556
1564
zend_mm_free_block * new_free_block ;
1557
1565
@@ -1575,6 +1583,12 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1575
1583
mm_block -> thread_id = tsrm_thread_id ();
1576
1584
# endif
1577
1585
ZEND_MM_SET_END_MAGIC (mm_block );
1586
+ #endif
1587
+ #if MEMORY_LIMIT
1588
+ heap -> size = heap -> size + true_size - orig_size ;
1589
+ if (heap -> peak < heap -> size ) {
1590
+ heap -> peak = heap -> size ;
1591
+ }
1578
1592
#endif
1579
1593
HANDLE_UNBLOCK_INTERRUPTIONS ();
1580
1594
return ZEND_MM_DATA_OF (mm_block );
@@ -1584,7 +1598,7 @@ static void *_zend_mm_realloc_int(zend_mm_heap *heap, void *p, size_t size ZEND_
1584
1598
#if ZEND_DEBUG
1585
1599
memcpy (ptr , p , mm_block -> debug .size );
1586
1600
#else
1587
- memcpy (ptr , p , ZEND_MM_BLOCK_SIZE ( mm_block ) - ZEND_MM_ALIGNED_HEADER_SIZE );
1601
+ memcpy (ptr , p , orig_size - ZEND_MM_ALIGNED_HEADER_SIZE );
1588
1602
#endif
1589
1603
_zend_mm_free_int (heap , p ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1590
1604
return ptr ;
0 commit comments