diff --git a/ext/curl/interface.c b/ext/curl/interface.c index b325138d8392e..456e777649d1e 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1270,8 +1270,39 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n) { php_curl *curl = curl_from_obj(object); - *table = &curl->postfields; - *n = 1; + zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); + + zend_get_gc_buffer_add_zval(gc_buffer, &curl->postfields); + if (curl->handlers) { + if (curl->handlers->read) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->read->func_name); + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->read->stream); + } + + if (curl->handlers->write) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write->func_name); + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write->stream); + } + + if (curl->handlers->write_header) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write_header->func_name); + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->write_header->stream); + } + + if (curl->handlers->progress) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->progress->func_name); + } + +#if LIBCURL_VERSION_NUM >= 0x071500 + if (curl->handlers->fnmatch) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->fnmatch->func_name); + } +#endif + + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers->std_err); + } + + zend_get_gc_buffer_use(gc_buffer, table, n); return zend_std_get_properties(object); } diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 16d8c04954546..53cea454a016a 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -578,6 +578,23 @@ void curl_multi_free_obj(zend_object *object) zend_object_std_dtor(&mh->std); } +static HashTable *curl_multi_get_gc(zend_object *object, zval **table, int *n) +{ + php_curlm *curl_multi = curl_multi_from_obj(object); + + zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); + + if (curl_multi->handlers) { + if (curl_multi->handlers->server_push) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl_multi->handlers->server_push->func_name); + } + } + + zend_get_gc_buffer_use(gc_buffer, table, n); + + return zend_std_get_properties(object); +} + void curl_multi_register_class(void) { zend_class_entry ce_multi; INIT_CLASS_ENTRY(ce_multi, "CurlMulti", curl_multi_methods); @@ -590,6 +607,7 @@ void curl_multi_register_class(void) { memcpy(&curl_multi_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_multi_handlers.offset = XtOffsetOf(php_curlm, std); curl_multi_handlers.free_obj = curl_multi_free_obj; + curl_multi_handlers.get_gc = curl_multi_get_gc; curl_multi_handlers.get_constructor = curl_multi_get_constructor; curl_multi_handlers.clone_obj = NULL; }