Skip to content

Commit 8aaffac

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Fix double-free of EG(errors)/persistent_script->warnings on persist of already persisted file
2 parents cd9eec7 + bcd4be7 commit 8aaffac

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2209,7 +2209,14 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
22092209
SHM_PROTECT();
22102210
HANDLE_UNBLOCK_INTERRUPTIONS();
22112211

2212-
zend_emit_recorded_errors();
2212+
/* We may have switched to an existing persistent script that was persisted in
2213+
* the meantime. Make sure to use its warnings if available. */
2214+
if (ZCG(accel_directives).record_warnings) {
2215+
EG(record_errors) = false;
2216+
zend_emit_recorded_errors_ex(persistent_script->num_warnings, persistent_script->warnings);
2217+
} else {
2218+
zend_emit_recorded_errors();
2219+
}
22132220
zend_free_recorded_errors();
22142221
} else {
22152222

ext/opcache/tests/gh19984.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
GH-19984: Double-free of EG(errors)/persistent_script->warnings on persist of already persisted file
3+
--EXTENSIONS--
4+
opcache
5+
pcntl
6+
--INI--
7+
opcache.enable_cli=1
8+
opcache.record_warnings=1
9+
--SKIPIF--
10+
<?php
11+
if (!function_exists('pcntl_fork')) die('skip pcntl_fork() not available');
12+
?>
13+
--FILE--
14+
<?php
15+
$pid = pcntl_fork();
16+
require __DIR__ . '/warning_replay.inc';
17+
?>
18+
--EXPECTF--
19+
Warning: Unsupported declare 'unknown' in %s on line %d
20+
21+
Warning: Unsupported declare 'unknown' in %s on line %d

ext/opcache/zend_accelerator_util_funcs.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,6 @@ void free_persistent_script(zend_persistent_script *persistent_script, int destr
6565
zend_string_release_ex(persistent_script->script.filename, 0);
6666
}
6767

68-
if (persistent_script->warnings) {
69-
for (uint32_t i = 0; i < persistent_script->num_warnings; i++) {
70-
zend_error_info *info = persistent_script->warnings[i];
71-
zend_string_release(info->filename);
72-
zend_string_release(info->message);
73-
efree(info);
74-
}
75-
efree(persistent_script->warnings);
76-
}
77-
7868
zend_accel_free_delayed_early_binding_list(persistent_script);
7969

8070
efree(persistent_script);

0 commit comments

Comments
 (0)