[PHP-CVS] [php-src] master: Use zend_hash_add_new_ptr() for the user_filter_map insertion.

[email protected] (David Carlier) Sun, 2 Aug 2026 20:32:44 +0000
Newsgroups php.cvs
Message-ID <[email protected]>
Author: David Carlier (devnexen)
Date: 2026-08-02T21:32:11+01:00

Commit: https://github.com/php/php-src/commit/33cdf36326319995a973d6009c0df34dcdc76292
Raw diff: https://github.com/php/php-src/commit/33cdf36326319995a973d6009c0df34dcdc76292.diff

Use zend_hash_add_new_ptr() for the user_filter_map insertion.

The volatile factory registration above already rejects a duplicate filter
name, so the name cannot be in the map either. The add_new variant asserts
that invariant in debug builds.

Close GH-22838

Changed paths:
  M  NEWS
  M  ext/standard/user_filters.c


Diff:

diff --git a/NEWS b/NEWS
index 425a48481a98..4e95bed34c84 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,8 @@ PHP                                                                        NEWS
     filegroup(), fileatime(), filemtime(), filectime(), filetype(),
     is_writable(), is_readable(), is_executable(), is_file(), is_dir(),
     is_link(), file_exists(), lstat(), stat(). (Girgias)
+  . Fixed bug GH-22818 (stream_filter_register() orphaned user_filter_map on
+    shutdown re-registration). (David Carlier)
 
 30 Jul 2026, PHP 8.6.0alpha3
 
diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c
index d69af26912cc..e65ddd78ba4d 100644
--- a/ext/standard/user_filters.c
+++ b/ext/standard/user_filters.c
@@ -613,8 +613,9 @@ PHP_FUNCTION(stream_filter_register)
 		zend_hash_init(BG(user_filter_map), 8, NULL, NULL, 0);
 	}
 
-	/* The factory has just been (re)registered, so keep the map in sync. */
-	zend_hash_update_ptr(BG(user_filter_map), filtername, ce);
+	/* The factory registration above already rejected a duplicate name, so the
+	 * filter name cannot be present in the map either. */
+	zend_hash_add_new_ptr(BG(user_filter_map), filtername, ce);
 
 	RETURN_TRUE;
 }