Commit 695f8264f74 for php

commit 695f8264f746602b43d93a3998be9d91c4b3655d
Author: Levi Morrison <levi.morrison@datadoghq.com>
Date:   Fri Oct 9 09:10:48 2026 -0600

    fix: system ID for Apache graceful restart (#24184)

    Apache forks workers from a parent process. During a graceful
    restart, PHP shuts down and starts up again in that same parent
    process.

    However, `finalized` was not reset to 0 during subsequent startups,
    so all calls to `zend_add_system_entropy()` would fail. This could
    cause the process state to diverge from the system ID used to
    validate OPcache's file cache.

    For example, `zend_get_resource_handle()` would still allocate a
    handle, but its entropy would not contribute to the system ID.
    Enabling, disabling, or reordering extensions or features across
    graceful restarts could therefore change resource-slot assignments
    without a corresponding change to the system ID.

    Reset `finalized` when initializing the system ID so each startup
    can register fresh entropy.

diff --git a/NEWS b/NEWS
index 64d75dfc03a..8dc808543b7 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ PHP                                                                        NEWS
 ?? ??? ????, PHP 8.4.28

 - Core:
+  . Fixed bug GH-24184 (System ID not being reinitialized after an Apache
+    graceful restart, potentially causing incompatible OPcache file cache
+    entries to be reused). (Levi Morrison)
   . Fixed memory leak when an exception already contains the pending exception
     in its previous chain. (Edmond)
   . Fixed bug GH-23979 (Nullsafe operator must not flush delayed oplines of an
diff --git a/Zend/zend_system_id.c b/Zend/zend_system_id.c
index 2c3ebab0f48..34142d95971 100644
--- a/Zend/zend_system_id.c
+++ b/Zend/zend_system_id.c
@@ -43,6 +43,7 @@ ZEND_API zend_result zend_add_system_entropy(const char *module_name, const char

 void zend_startup_system_id(void)
 {
+	finalized = 0;
 	PHP_MD5Init(&context);
 	PHP_MD5Update(&context, PHP_VERSION, sizeof(PHP_VERSION)-1);
 	PHP_MD5Update(&context, ZEND_EXTENSION_BUILD_ID, sizeof(ZEND_EXTENSION_BUILD_ID)-1);
diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c
index c5ae9a71c20..718def0b31c 100644
--- a/ext/zend_test/test.c
+++ b/ext/zend_test/test.c
@@ -36,6 +36,7 @@
 #include "test_arginfo.h"
 #include "zend_call_stack.h"
 #include "zend_exceptions.h"
+#include "zend_system_id.h"
 #include "zend_mm_custom_handlers.h"
 #include <signal.h>

@@ -1180,6 +1181,7 @@ static ZEND_METHOD(_ZendTestMagicCallForward, __call)
 }

 PHP_INI_BEGIN()
+	PHP_INI_ENTRY("zend_test.register_system_entropy", "0", PHP_INI_SYSTEM, NULL)
 	STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals)
 	STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals)
 	STD_PHP_INI_BOOLEAN("zend_test.print_stderr_mshutdown", "0", PHP_INI_SYSTEM, OnUpdateBool, print_stderr_mshutdown, zend_zend_test_globals, zend_test_globals)
@@ -1378,6 +1380,10 @@ PHP_MINIT_FUNCTION(zend_test)
 	// Loading via dl() not supported with the observer API
 	if (type != MODULE_TEMPORARY) {
 		REGISTER_INI_ENTRIES();
+		if (INI_BOOL("zend_test.register_system_entropy") &&
+			zend_add_system_entropy("zend_test", "test", ZEND_STRL("test entropy")) == FAILURE) {
+			php_error_docref(NULL, E_WARNING, "Failed to register system entropy");
+		}
 	} else {
 		(void)ini_entries;
 	}
diff --git a/ext/zend_test/tests/system_id_reinitialization.phpt b/ext/zend_test/tests/system_id_reinitialization.phpt
new file mode 100644
index 00000000000..5e80b567c62
--- /dev/null
+++ b/ext/zend_test/tests/system_id_reinitialization.phpt
@@ -0,0 +1,40 @@
+--TEST--
+System ID reinitialization accepts extension entropy after engine restart
+--SKIPIF--
+<?php
+if (!extension_loaded('zend_test')) die('skip zend_test extension required');
+?>
+--INI--
+zend_test.register_system_entropy=1
+--PHPDBG--
+r
+clean
+r
+clean
+r
+q
+--FILE--
+<?php
+echo "Done\n";
+?>
+--EXPECTF--
+[Successful compilation of %s]
+prompt> Done
+[Script ended normally]
+prompt> Cleaning Execution Environment
+Classes    %d
+Functions  %d
+Constants  %d
+Includes   0
+[Script ended normally]
+prompt> Done
+[Script ended normally]
+prompt> Cleaning Execution Environment
+Classes    %d
+Functions  %d
+Constants  %d
+Includes   0
+[Script ended normally]
+prompt> Done
+[Script ended normally]
+prompt>