Skip to content

Commit 9a9d98e

Browse files
danogarnaud-lb
authored andcommitted
Do not delete main chunk in zend_gc
Closes GH-18756. Co-authored-by: Arnaud Le Blanc <[email protected]>
1 parent ae92b85 commit 9a9d98e

File tree

6 files changed

+32
-2
lines changed

6 files changed

+32
-2
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ PHP NEWS
55
- Core:
66
. Fixed GH-18695 (zend_ast_export() - float number is not preserved).
77
(Oleg Efimov)
8+
. Do not delete main chunk in zend_gc. (danog, Arnaud)
89

910
- Curl:
1011
. Fix memory leak when setting a list via curl_setopt fails. (nielsdos)

Zend/tests/gh18756.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
Bug GH-18756: Zend MM may delete the main chunk
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
8+
zend_test_gh18756();
9+
10+
?>
11+
==DONE==
12+
--EXPECT--
13+
==DONE==

Zend/zend_alloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2047,7 +2047,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
20472047
i++;
20482048
}
20492049
}
2050-
if (chunk->free_pages == ZEND_MM_PAGES - ZEND_MM_FIRST_PAGE) {
2050+
if (chunk->free_pages == ZEND_MM_PAGES - ZEND_MM_FIRST_PAGE && chunk != heap->main_chunk) {
20512051
zend_mm_chunk *next_chunk = chunk->next;
20522052

20532053
zend_mm_delete_chunk(heap, chunk);

ext/zend_test/test.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,3 +1516,13 @@ static PHP_FUNCTION(zend_test_create_throwing_resource)
15161516
zend_resource *res = zend_register_resource(NULL, le_throwing_resource);
15171517
ZVAL_RES(return_value, res);
15181518
}
1519+
1520+
static PHP_FUNCTION(zend_test_gh18756)
1521+
{
1522+
ZEND_PARSE_PARAMETERS_NONE();
1523+
1524+
zend_mm_heap *heap = zend_mm_startup();
1525+
zend_mm_gc(heap);
1526+
zend_mm_gc(heap);
1527+
zend_mm_shutdown(heap, true, false);
1528+
}

ext/zend_test/test.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ function zend_test_cast_fread($stream): void {}
262262
function zend_test_is_zend_ptr(int $addr): bool {}
263263

264264
function zend_test_log_err_debug(string $str): void {}
265+
266+
function zend_test_gh18756(): void {}
265267
}
266268

267269
namespace ZendTestNS {

ext/zend_test/test_arginfo.h

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)