diff --git a/NEWS b/NEWS index 4f32e91c769..78bca780f27 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed oss-fuzz #54325 (Use-after-free of name in var-var with malicious error handler). (ilutov) + . Fixed oss-fuzz #64209 (In-place modification of filename in + php_message_handler_for_zend). (ilutov) - DOM: . Fixed bug GH-12616 (DOM: Removing XMLNS namespace node results in invalid diff --git a/Zend/tests/oss_fuzz_64209.phpt b/Zend/tests/oss_fuzz_64209.phpt new file mode 100644 index 00000000000..599ae258e5b --- /dev/null +++ b/Zend/tests/oss_fuzz_64209.phpt @@ -0,0 +1,13 @@ +--TEST-- +oss-fuzz #64209: Fix in-place modification of filename in php_message_handler_for_zend +--FILE-- + +--EXPECTF-- +Warning: require(://@): Failed to open stream: No such file or directory in %s on line %d + +Fatal error: Uncaught Error: Failed opening required '://@' (include_path='%s') in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/main/main.c b/main/main.c index 5ca23a92dab..fa296eed307 100644 --- a/main/main.c +++ b/main/main.c @@ -1611,15 +1611,24 @@ static void php_free_request_globals(void) static ZEND_COLD void php_message_handler_for_zend(zend_long message, const void *data) { switch (message) { - case ZMSG_FAILED_INCLUDE_FOPEN: - php_error_docref("function.include", E_WARNING, "Failed opening '%s' for inclusion (include_path='%s')", php_strip_url_passwd((char *) data), STR_PRINT(PG(include_path))); + case ZMSG_FAILED_INCLUDE_FOPEN: { + char *tmp = estrdup((char *) data); + php_error_docref("function.include", E_WARNING, "Failed opening '%s' for inclusion (include_path='%s')", php_strip_url_passwd(tmp), STR_PRINT(PG(include_path))); + efree(tmp); break; - case ZMSG_FAILED_REQUIRE_FOPEN: - zend_throw_error(NULL, "Failed opening required '%s' (include_path='%s')", php_strip_url_passwd((char *) data), STR_PRINT(PG(include_path))); + } + case ZMSG_FAILED_REQUIRE_FOPEN: { + char *tmp = estrdup((char *) data); + zend_throw_error(NULL, "Failed opening required '%s' (include_path='%s')", php_strip_url_passwd(tmp), STR_PRINT(PG(include_path))); + efree(tmp); break; - case ZMSG_FAILED_HIGHLIGHT_FOPEN: - php_error_docref(NULL, E_WARNING, "Failed opening '%s' for highlighting", php_strip_url_passwd((char *) data)); + } + case ZMSG_FAILED_HIGHLIGHT_FOPEN: { + char *tmp = estrdup((char *) data); + php_error_docref(NULL, E_WARNING, "Failed opening '%s' for highlighting", php_strip_url_passwd(tmp)); + efree(tmp); break; + } case ZMSG_MEMORY_LEAK_DETECTED: case ZMSG_MEMORY_LEAK_REPEATED: #if ZEND_DEBUG