Commit f2469f6684f for php
commit f2469f6684f4f3c429daaadbfb62b3fe7c188117
Merge: 4a735661632 71e56ed7a97
Author: Ilia Alshanetsky <ilia@ilia.ws>
Date: Wed Sep 30 13:27:53 2026 -0400
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4:
ext/pdo: Report bound params and columns to GC
diff --cc ext/pdo/pdo_stmt.c
index 1077823d7ee,9afdc52a229..d0bb89ea6a2
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@@ -2048,19 -2154,26 +2048,35 @@@ out
static HashTable *dbstmt_get_gc(zend_object *object, zval **gc_data, int *gc_count)
{
pdo_stmt_t *stmt = php_pdo_stmt_fetch_object(object);
+ enum pdo_fetch_type default_fetch_mode = stmt->default_fetch_type & ~PDO_FETCH_FLAGS;
zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
- zend_get_gc_buffer_add_zval(gc_buffer, &stmt->database_object_handle);
- zend_get_gc_buffer_add_zval(gc_buffer, &stmt->fetch.into);
+ if (stmt->database_object_handle) {
+ zend_get_gc_buffer_add_obj(gc_buffer, stmt->database_object_handle);
+ }
+ if (default_fetch_mode == PDO_FETCH_INTO) {
+ if (stmt->fetch.into) {
+ zend_get_gc_buffer_add_obj(gc_buffer, stmt->fetch.into);
+ }
+ } else if (default_fetch_mode == PDO_FETCH_CLASS && stmt->fetch.cls.ctor_args != NULL) {
+ zend_get_gc_buffer_add_ht(gc_buffer, stmt->fetch.cls.ctor_args);
+ }
+ if (stmt->bound_params) {
+ zval *val;
+ ZEND_HASH_FOREACH_VAL(stmt->bound_params, val) {
+ struct pdo_bound_param_data *param = Z_PTR_P(val);
+ zend_get_gc_buffer_add_zval(gc_buffer, ¶m->parameter);
+ zend_get_gc_buffer_add_zval(gc_buffer, ¶m->driver_params);
+ } ZEND_HASH_FOREACH_END();
+ }
+ if (stmt->bound_columns) {
+ zval *val;
+ ZEND_HASH_FOREACH_VAL(stmt->bound_columns, val) {
+ struct pdo_bound_param_data *param = Z_PTR_P(val);
+ zend_get_gc_buffer_add_zval(gc_buffer, ¶m->parameter);
+ zend_get_gc_buffer_add_zval(gc_buffer, ¶m->driver_params);
+ } ZEND_HASH_FOREACH_END();
+ }
zend_get_gc_buffer_use(gc_buffer, gc_data, gc_count);
/**