@@ -495,8 +495,8 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n)
495
495
zend_get_gc_buffer_add_fcc (gc_buffer , & curl -> handlers .xferinfo );
496
496
}
497
497
498
- if (curl -> handlers .fnmatch ) {
499
- zend_get_gc_buffer_add_zval (gc_buffer , & curl -> handlers .fnmatch -> func_name );
498
+ if (ZEND_FCC_INITIALIZED ( curl -> handlers .fnmatch ) ) {
499
+ zend_get_gc_buffer_add_fcc (gc_buffer , & curl -> handlers .fnmatch );
500
500
}
501
501
502
502
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
@@ -624,33 +624,22 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
624
624
static int curl_fnmatch (void * ctx , const char * pattern , const char * string )
625
625
{
626
626
php_curl * ch = (php_curl * ) ctx ;
627
- php_curl_callback * t = ch -> handlers .fnmatch ;
628
627
int rval = CURL_FNMATCHFUNC_FAIL ;
629
628
zval argv [3 ];
630
629
zval retval ;
631
- zend_result error ;
632
- zend_fcall_info fci ;
633
630
634
631
GC_ADDREF (& ch -> std );
635
632
ZVAL_OBJ (& argv [0 ], & ch -> std );
636
633
ZVAL_STRING (& argv [1 ], pattern );
637
634
ZVAL_STRING (& argv [2 ], string );
638
635
639
- fci .size = sizeof (fci );
640
- ZVAL_COPY_VALUE (& fci .function_name , & t -> func_name );
641
- fci .object = NULL ;
642
- fci .retval = & retval ;
643
- fci .param_count = 3 ;
644
- fci .params = argv ;
645
- fci .named_params = NULL ;
646
-
647
- ch -> in_callback = 1 ;
648
- error = zend_call_function (& fci , & t -> fci_cache );
649
- ch -> in_callback = 0 ;
650
- if (error == FAILURE ) {
651
- php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_FNMATCH_FUNCTION" );
652
- } else if (!Z_ISUNDEF (retval )) {
636
+ ch -> in_callback = true;
637
+ zend_call_known_fcc (& ch -> handlers .fnmatch , & retval , /* param_count */ 3 , argv , /* named_params */ NULL );
638
+ ch -> in_callback = false;
639
+
640
+ if (!Z_ISUNDEF (retval )) {
653
641
_php_curl_verify_handlers (ch , /* reporterror */ true);
642
+ /* TODO Check callback returns an int or something castable to int */
654
643
rval = zval_get_long (& retval );
655
644
}
656
645
zval_ptr_dtor (& argv [0 ]);
@@ -1025,7 +1014,7 @@ void init_curl_handle(php_curl *ch)
1025
1014
ch -> handlers .read = ecalloc (1 , sizeof (php_curl_read ));
1026
1015
ch -> handlers .progress = empty_fcall_info_cache ;
1027
1016
ch -> handlers .xferinfo = empty_fcall_info_cache ;
1028
- ch -> handlers .fnmatch = NULL ;
1017
+ ch -> handlers .fnmatch = empty_fcall_info_cache ;
1029
1018
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
1030
1019
ch -> handlers .sshhostkey = empty_fcall_info_cache ;
1031
1020
#endif
@@ -1149,17 +1138,6 @@ PHP_FUNCTION(curl_init)
1149
1138
}
1150
1139
/* }}} */
1151
1140
1152
- static void _php_copy_callback (php_curl * ch , php_curl_callback * * new_callback , php_curl_callback * source_callback , CURLoption option )
1153
- {
1154
- if (source_callback ) {
1155
- * new_callback = ecalloc (1 , sizeof (php_curl_callback ));
1156
- if (!Z_ISUNDEF (source_callback -> func_name )) {
1157
- ZVAL_COPY (& (* new_callback )-> func_name , & source_callback -> func_name );
1158
- }
1159
- curl_easy_setopt (ch -> cp , option , (void * ) ch );
1160
- }
1161
- }
1162
-
1163
1141
static void php_curl_copy_fcc_with_option (php_curl * ch , CURLoption option , zend_fcall_info_cache * target_fcc , zend_fcall_info_cache * source_fcc )
1164
1142
{
1165
1143
if (ZEND_FCC_INITIALIZED (* source_fcc )) {
@@ -1209,7 +1187,7 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
1209
1187
1210
1188
php_curl_copy_fcc_with_option (ch , CURLOPT_PROGRESSDATA , & ch -> handlers .progress , & source -> handlers .progress );
1211
1189
php_curl_copy_fcc_with_option (ch , CURLOPT_XFERINFODATA , & ch -> handlers .xferinfo , & source -> handlers .xferinfo );
1212
- _php_copy_callback (ch , & ch -> handlers .fnmatch , source -> handlers .fnmatch , CURLOPT_FNMATCH_DATA );
1190
+ php_curl_copy_fcc_with_option (ch , CURLOPT_FNMATCH_DATA , & ch -> handlers .fnmatch , & source -> handlers .fnmatch );
1213
1191
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
1214
1192
php_curl_copy_fcc_with_option (ch , CURLOPT_SSH_HOSTKEYDATA , & ch -> handlers .sshhostkey , & source -> handlers .sshhostkey );
1215
1193
#endif
@@ -2099,6 +2077,18 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2099
2077
break ;
2100
2078
}
2101
2079
2080
+ case CURLOPT_FNMATCH_FUNCTION : {
2081
+ /* Check value is actually a callable and set it */
2082
+ const char option_name [] = "CURLOPT_FNMATCH_FUNCTION" ;
2083
+ bool result = php_curl_set_callable_handler (& ch -> handlers .fnmatch , zvalue , is_array_config , option_name );
2084
+ if (!result ) {
2085
+ return FAILURE ;
2086
+ }
2087
+ curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_FUNCTION , curl_fnmatch );
2088
+ curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_DATA , ch );
2089
+ break ;
2090
+ }
2091
+
2102
2092
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2103
2093
case CURLOPT_SSH_HOSTKEYFUNCTION : {
2104
2094
/* Check value is actually a callable and set it */
@@ -2208,18 +2198,6 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2208
2198
}
2209
2199
break ;
2210
2200
2211
- case CURLOPT_FNMATCH_FUNCTION :
2212
- curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_FUNCTION , curl_fnmatch );
2213
- curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_DATA , ch );
2214
- if (ch -> handlers .fnmatch == NULL ) {
2215
- ch -> handlers .fnmatch = ecalloc (1 , sizeof (php_curl_callback ));
2216
- } else if (!Z_ISUNDEF (ch -> handlers .fnmatch -> func_name )) {
2217
- zval_ptr_dtor (& ch -> handlers .fnmatch -> func_name );
2218
- ch -> handlers .fnmatch -> fci_cache = empty_fcall_info_cache ;
2219
- }
2220
- ZVAL_COPY (& ch -> handlers .fnmatch -> func_name , zvalue );
2221
- break ;
2222
-
2223
2201
/* Curl blob options */
2224
2202
#if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */
2225
2203
case CURLOPT_ISSUERCERT_BLOB :
@@ -2708,14 +2686,6 @@ PHP_FUNCTION(curl_close)
2708
2686
}
2709
2687
/* }}} */
2710
2688
2711
- static void _php_curl_free_callback (php_curl_callback * callback )
2712
- {
2713
- if (callback ) {
2714
- zval_ptr_dtor (& callback -> func_name );
2715
- efree (callback );
2716
- }
2717
- }
2718
-
2719
2689
static void curl_free_obj (zend_object * object )
2720
2690
{
2721
2691
php_curl * ch = curl_from_obj (object );
@@ -2782,7 +2752,9 @@ static void curl_free_obj(zend_object *object)
2782
2752
if (ZEND_FCC_INITIALIZED (ch -> handlers .xferinfo )) {
2783
2753
zend_fcc_dtor (& ch -> handlers .xferinfo );
2784
2754
}
2785
- _php_curl_free_callback (ch -> handlers .fnmatch );
2755
+ if (ZEND_FCC_INITIALIZED (ch -> handlers .fnmatch )) {
2756
+ zend_fcc_dtor (& ch -> handlers .fnmatch );
2757
+ }
2786
2758
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2787
2759
if (ZEND_FCC_INITIALIZED (ch -> handlers .sshhostkey )) {
2788
2760
zend_fcc_dtor (& ch -> handlers .sshhostkey );
@@ -2859,10 +2831,8 @@ static void _php_curl_reset_handlers(php_curl *ch)
2859
2831
ch -> handlers .xferinfo .function_handler = NULL ;
2860
2832
}
2861
2833
2862
- if (ch -> handlers .fnmatch ) {
2863
- zval_ptr_dtor (& ch -> handlers .fnmatch -> func_name );
2864
- efree (ch -> handlers .fnmatch );
2865
- ch -> handlers .fnmatch = NULL ;
2834
+ if (ZEND_FCC_INITIALIZED (ch -> handlers .fnmatch )) {
2835
+ zend_fcc_dtor (& ch -> handlers .fnmatch );
2866
2836
}
2867
2837
2868
2838
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
0 commit comments