Commit 85cf3ac22f7 for php

commit 85cf3ac22f783b6cd9ee4ac611e3ed04ca74415c
Author: lacatoire <la.catoire@gmail.com>
Date:   Wed Nov 4 15:17:45 2026 +0800

    ext/curl: Clear CURLOPT_PRIVATE in curl_reset() (#25170)

    CURLOPT_PRIVATE is stored only on the PHP side, so curl_easy_reset()
    does not clear it. Release the stored value in curl_reset() so
    CURLINFO_PRIVATE returns false after reset.

    Closes #25170

diff --git a/NEWS b/NEWS
index 8d22dd5d16a..41ba7e3ff87 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? ????, PHP 8.4.29

+- Curl:
+  . Fixed curl_reset() retaining CURLOPT_PRIVATE after reset. (lacatoire)

 19 Nov 2026, PHP 8.4.28

diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index a101e852ee9..b8c6ce7dde3 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -3028,6 +3028,8 @@ PHP_FUNCTION(curl_reset)
 	}

 	curl_easy_reset(ch->cp);
+	zval_ptr_dtor(&ch->private_data);
+	ZVAL_UNDEF(&ch->private_data);
 	_php_curl_reset_handlers(ch);
 	_php_curl_set_default_options(ch);
 }
diff --git a/ext/curl/tests/curl_reset_private.phpt b/ext/curl/tests/curl_reset_private.phpt
new file mode 100644
index 00000000000..400079135cf
--- /dev/null
+++ b/ext/curl/tests/curl_reset_private.phpt
@@ -0,0 +1,15 @@
+--TEST--
+curl_reset(): CURLOPT_PRIVATE is cleared
+--EXTENSIONS--
+curl
+--FILE--
+<?php
+$ch = curl_init();
+curl_setopt($ch, CURLOPT_PRIVATE, "secret-marker");
+var_dump(curl_getinfo($ch, CURLINFO_PRIVATE));
+curl_reset($ch);
+var_dump(curl_getinfo($ch, CURLINFO_PRIVATE));
+?>
+--EXPECT--
+string(13) "secret-marker"
+bool(false)