Commit 3fda4e9c187 for php.net

commit 3fda4e9c187929cb95d0eec90c7fcd82e4161600
Author: Gina Peter Banyard <girgias@php.net>
Date:   Wed Aug 5 15:54:12 2026 +0100

    bz2: deprecate passing objects as array

    RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_as_parameters_to_the_bzip2decompress_and_bzip2compress_stream_filters

diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c
index 845c11865f1..47fc9fc6e62 100644
--- a/ext/bz2/bz2_filter.c
+++ b/ext/bz2/bz2_filter.c
@@ -402,12 +402,19 @@ static php_stream_filter *php_bz2_decompress_filter_create(zval *filter_params,
 			&& Z_TYPE_P(filter_params) != IS_ARRAY
 			&& Z_TYPE_P(filter_params) != IS_OBJECT
 		)) {
-			php_error_docref(NULL, E_WARNING,
+			php_error_docref("filters.compression", E_WARNING,
 				"Filter parameters for bzip2.decompress filter must be of type array|object|bool, %s given",
 				zend_zval_type_name(filter_params)
 			);
 			return NULL;
 		}
+		if (Z_TYPE_P(filter_params) == IS_OBJECT) {
+			php_error_docref("filters.compression", E_DEPRECATED,
+				"Passing an object for filter parameters for bzip2.decompress is deprecated, call get_object_vars() first instead");
+			if (UNEXPECTED(EG(exception))) {
+				return NULL;
+			}
+		}

 		if (Z_TYPE_P(filter_params) == IS_TRUE || Z_TYPE_P(filter_params) == IS_FALSE) {
 			small_footprint = Z_TYPE_P(filter_params) == IS_TRUE;
@@ -448,12 +455,19 @@ static php_stream_filter *php_bz2_compress_filter_create(zval *filter_params, bo

 	if (filter_params) {
 		if (UNEXPECTED(Z_TYPE_P(filter_params) != IS_ARRAY && Z_TYPE_P(filter_params) != IS_OBJECT)) {
-			php_error_docref(NULL, E_WARNING,
+			php_error_docref("filters.compression", E_WARNING,
 				"Filter parameters for bzip2.compress filter must be of type array|object, %s given",
 				zend_zval_type_name(filter_params)
 			);
 			return NULL;
 		}
+		if (Z_TYPE_P(filter_params) == IS_OBJECT) {
+			php_error_docref("filters.compression", E_DEPRECATED,
+				"Passing an object for filter parameters for bzip2.compress is deprecated, call get_object_vars() first instead");
+			if (UNEXPECTED(EG(exception))) {
+				return NULL;
+			}
+		}

 		const HashTable *filter_params_ht = HASH_OF(filter_params);
 		/* TODO: convert php_stream_filter_parse_write_seek_mode() to take HashTable */
@@ -468,10 +482,10 @@ static php_stream_filter *php_bz2_compress_filter_create(zval *filter_params, bo
 			/* How much memory to allocate (1 - 9) x 100kb */
 			zend_long blocks = zval_try_get_long(blocks_zv, &failed);
 			if (UNEXPECTED(failed)) {
-				php_error_docref(NULL, E_WARNING, "Number of blocks parameter must be of type int, %s given", zend_zval_type_name(blocks_zv));
+				php_error_docref("filters.compression", E_WARNING, "Number of blocks parameter must be of type int, %s given", zend_zval_type_name(blocks_zv));
 				return NULL;
 			} else if (blocks < 1 || blocks > 9) {
-				php_error_docref(NULL, E_WARNING, "Number of blocks to allocate must be between 1 and 9, " ZEND_LONG_FMT " given", blocks);
+				php_error_docref("filters.compression", E_WARNING, "Number of blocks to allocate must be between 1 and 9, " ZEND_LONG_FMT " given", blocks);
 				return NULL;
 			} else {
 				blockSize100k = (int) blocks;
@@ -485,10 +499,10 @@ static php_stream_filter *php_bz2_compress_filter_create(zval *filter_params, bo
 			/* Work Factor (0 - 250) */
 			zend_long work = zval_try_get_long(work_zv, &failed);
 			if (UNEXPECTED(failed)) {
-				php_error_docref(NULL, E_WARNING, "Work factor parameter must be of type int, %s given", zend_zval_type_name(work_zv));
+				php_error_docref("filters.compression", E_WARNING, "Work factor parameter must be of type int, %s given", zend_zval_type_name(work_zv));
 				return NULL;
 			} else if (work < 0 || work > 250) {
-				php_error_docref(NULL, E_WARNING, "Work factor must be between 0 and 250, " ZEND_LONG_FMT " given", work);
+				php_error_docref("filters.compression", E_WARNING, "Work factor must be between 0 and 250, " ZEND_LONG_FMT " given", work);
 				return NULL;
 			} else {
 				workFactor = (int) work;
diff --git a/ext/bz2/tests/filter_broken_object_options.phpt b/ext/bz2/tests/filter_broken_object_options.phpt
index 84e49a64ccb..c24e2893c2b 100644
--- a/ext/bz2/tests/filter_broken_object_options.phpt
+++ b/ext/bz2/tests/filter_broken_object_options.phpt
@@ -21,5 +21,8 @@ class ParamsDecompress {
 fwrite($fp, "Hello world, hopefully not broken\n");

 ?>
---EXPECT--
+--EXPECTF--
+Deprecated: stream_filter_append(): Passing an object for filter parameters for bzip2.compress is deprecated, call get_object_vars() first instead in %s on line %d
+
+Deprecated: stream_filter_append(): Passing an object for filter parameters for bzip2.decompress is deprecated, call get_object_vars() first instead in %s on line %d
 Hello world, hopefully not broken