Commit b0ea8b25375 for php
commit b0ea8b2537565ad5fb04c13a6e85831d54bfc0d7
Merge: 43c60146708 83c59b80530
Author: David Carlier <devnexen@gmail.com>
Date: Thu Sep 24 11:02:50 2026 +0100
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4:
sapi/cli: Fix crash in the CLI server when a client is reset before being accepted
ext/curl: Preserve callback lifetime without rejecting callback changes (#23863)
diff --cc ext/curl/tests/curl_callback_lifetime_destructor.phpt
index 00000000000,6611cb90e00..d7c9bddbbc4
mode 000000,100644..100644
--- a/ext/curl/tests/curl_callback_lifetime_destructor.phpt
+++ b/ext/curl/tests/curl_callback_lifetime_destructor.phpt
@@@ -1,0 -1,52 +1,54 @@@
+ --TEST--
+ GH-23814 (Curl callback receivers are destroyed with the callback guard still set)
+ --EXTENSIONS--
+ curl
+ --SKIPIF--
+ <?php
+ if (!in_array('file', curl_version()['protocols'], true)) {
+ die('skip file protocol not supported');
+ }
+ ?>
+ --FILE--
+ <?php
+ class Callback {
+ public function __construct(private CurlHandle $handle) {}
+
+ public function write(CurlHandle $handle, string $data): int {
+ curl_setopt($handle, CURLOPT_WRITEFUNCTION, null);
+ echo "Callback returning\n";
+ return strlen($data);
+ }
+
+ public function __destruct() {
+ foreach (['curl_reset', 'curl_close'] as $function) {
+ try {
+ $function($this->handle);
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ }
+ curl_setopt($this->handle, CURLOPT_WRITEFUNCTION,
+ static function (CurlHandle $handle, string $data): int {
+ echo "Callback installed by destructor\n";
+ return strlen($data);
+ });
+ }
+ }
+
+ $handle = curl_init('file://' . __FILE__);
+ curl_setopt($handle, CURLOPT_WRITEFUNCTION, [new Callback($handle), 'write']);
+ var_dump(curl_exec($handle));
+ var_dump(curl_exec($handle));
+ curl_reset($handle);
+ echo "Reset outside callback succeeded\n";
+ ?>
---EXPECT--
++--EXPECTF--
+ Callback returning
+ curl_reset(): Attempt to reset cURL handle from a callback
++
++Deprecated: Function curl_close() is deprecated since 8.5, as it has no effect since PHP 8.0 in %s on line %d
+ curl_close(): Attempt to close cURL handle from a callback
+ bool(true)
+ Callback installed by destructor
+ bool(true)
+ Reset outside callback succeeded