Commit 2024c71e214 for php

commit 2024c71e2143c7f69186ba0dffd6ef89a0579cd9
Author: Marc <m@pyc.ac>
Date:   Sun Nov 8 22:11:12 2026 +0700

    fuzzer: make ZTS build possible (#22713)

diff --git a/sapi/fuzzer/config.m4 b/sapi/fuzzer/config.m4
index 47ebfef7622..ce045c8962d 100644
--- a/sapi/fuzzer/config.m4
+++ b/sapi/fuzzer/config.m4
@@ -21,11 +21,6 @@ AC_DEFUN([PHP_FUZZER_TARGET], [
 ])

 if test "$PHP_FUZZER" != "no"; then
-  AS_VAR_IF([enable_zts], [yes], [AC_MSG_ERROR(m4_text_wrap([
-    Thread safety (--enable-zts) is not supported when building fuzzing module
-    (--enable-fuzzer). Please build fuzzer without ZTS.
-  ]))])
-
   dnl Don't use PHP_REQUIRE_CXX() to avoid unnecessarily pulling in -lstdc++
   AC_PROG_CXX
   AC_PROG_CXXCPP
diff --git a/sapi/fuzzer/fuzzer-exif.c b/sapi/fuzzer/fuzzer-exif.c
index 98f571f7cca..855f5ebef18 100644
--- a/sapi/fuzzer/fuzzer-exif.c
+++ b/sapi/fuzzer/fuzzer-exif.c
@@ -14,7 +14,7 @@

 #include "fuzzer.h"

-#include "Zend/zend.h"
+#include "main/php.h"
 #include <main/php_config.h>
 #include "main/php_main.h"
 #include "ext/standard/php_var.h"
diff --git a/sapi/fuzzer/fuzzer-json.c b/sapi/fuzzer/fuzzer-json.c
index 7ffa28df245..9633023e302 100644
--- a/sapi/fuzzer/fuzzer-json.c
+++ b/sapi/fuzzer/fuzzer-json.c
@@ -15,7 +15,7 @@

 #include "fuzzer.h"

-#include "Zend/zend.h"
+#include "main/php.h"
 #include <main/php_config.h>
 #include "main/php_main.h"

diff --git a/sapi/fuzzer/fuzzer-mbregex.c b/sapi/fuzzer/fuzzer-mbregex.c
index 2607fb46d6a..f7f16826b5d 100644
--- a/sapi/fuzzer/fuzzer-mbregex.c
+++ b/sapi/fuzzer/fuzzer-mbregex.c
@@ -15,7 +15,7 @@

 #include "fuzzer.h"

-#include "Zend/zend.h"
+#include "main/php.h"
 #include <main/php_config.h>
 #include "main/php_main.h"
 #include "oniguruma.h"
diff --git a/sapi/fuzzer/fuzzer-mbstring.c b/sapi/fuzzer/fuzzer-mbstring.c
index 92ea3aae999..58b7452a3e8 100644
--- a/sapi/fuzzer/fuzzer-mbstring.c
+++ b/sapi/fuzzer/fuzzer-mbstring.c
@@ -13,7 +13,7 @@
  */


-#include "zend.h"
+#include "main/php.h"
 #include "fuzzer.h"
 #include "fuzzer-sapi.h"
 #include "ext/mbstring/mbstring.h"
diff --git a/sapi/fuzzer/fuzzer-sapi.c b/sapi/fuzzer/fuzzer-sapi.c
index 53172cc7b26..a64b1c0a4a4 100644
--- a/sapi/fuzzer/fuzzer-sapi.c
+++ b/sapi/fuzzer/fuzzer-sapi.c
@@ -28,6 +28,8 @@
 #include "fuzzer.h"
 #include "fuzzer-sapi.h"

+ZEND_TSRMLS_CACHE_DEFINE()
+
 static const char HARDCODED_INI[] =
 	"html_errors=0\n"
 	"implicit_flush=1\n"
@@ -150,6 +152,15 @@ int fuzzer_init_php(const char *extra_ini)
 	__lsan_disable();
 #endif

+#ifdef ZTS
+	php_tsrm_startup();
+# ifdef PHP_WIN32
+	ZEND_TSRMLS_CACHE_UPDATE();
+# endif
+#endif
+
+	zend_signal_startup();
+
 	sapi_startup(&fuzzer_module);
 	fuzzer_module.phpinfo_as_text = 1;

@@ -253,6 +264,10 @@ int fuzzer_shutdown_php(void)
 	php_module_shutdown();
 	sapi_shutdown();

+#ifdef ZTS
+	tsrm_shutdown();
+#endif
+
 	free((void *)fuzzer_module.ini_entries);
 	return SUCCESS;
 }
diff --git a/sapi/fuzzer/fuzzer-unserialize.c b/sapi/fuzzer/fuzzer-unserialize.c
index beee0d20195..166740be740 100644
--- a/sapi/fuzzer/fuzzer-unserialize.c
+++ b/sapi/fuzzer/fuzzer-unserialize.c
@@ -15,7 +15,7 @@

 #include "fuzzer.h"

-#include "Zend/zend.h"
+#include "main/php.h"
 #include <main/php_config.h>
 #include "main/php_main.h"

diff --git a/sapi/fuzzer/fuzzer-unserializehash.c b/sapi/fuzzer/fuzzer-unserializehash.c
index 7bee0b80956..e9e063f82af 100644
--- a/sapi/fuzzer/fuzzer-unserializehash.c
+++ b/sapi/fuzzer/fuzzer-unserializehash.c
@@ -13,7 +13,7 @@

 #include "fuzzer.h"

-#include "Zend/zend.h"
+#include "main/php.h"
 #include <main/php_config.h>
 #include "main/php_main.h"