@@ -496,8 +496,8 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n)
496
496
zend_get_gc_buffer_add_fcc (gc_buffer , & curl -> handlers .xferinfo );
497
497
}
498
498
499
- if (curl -> handlers .fnmatch ) {
500
- zend_get_gc_buffer_add_zval (gc_buffer , & curl -> handlers .fnmatch -> func_name );
499
+ if (ZEND_FCC_INITIALIZED ( curl -> handlers .fnmatch ) ) {
500
+ zend_get_gc_buffer_add_fcc (gc_buffer , & curl -> handlers .fnmatch );
501
501
}
502
502
503
503
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
@@ -625,33 +625,22 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
625
625
static int curl_fnmatch (void * ctx , const char * pattern , const char * string )
626
626
{
627
627
php_curl * ch = (php_curl * ) ctx ;
628
- php_curl_callback * t = ch -> handlers .fnmatch ;
629
628
int rval = CURL_FNMATCHFUNC_FAIL ;
630
629
zval argv [3 ];
631
630
zval retval ;
632
- zend_result error ;
633
- zend_fcall_info fci ;
634
631
635
632
GC_ADDREF (& ch -> std );
636
633
ZVAL_OBJ (& argv [0 ], & ch -> std );
637
634
ZVAL_STRING (& argv [1 ], pattern );
638
635
ZVAL_STRING (& argv [2 ], string );
639
636
640
- fci .size = sizeof (fci );
641
- ZVAL_COPY_VALUE (& fci .function_name , & t -> func_name );
642
- fci .object = NULL ;
643
- fci .retval = & retval ;
644
- fci .param_count = 3 ;
645
- fci .params = argv ;
646
- fci .named_params = NULL ;
647
-
648
- ch -> in_callback = 1 ;
649
- error = zend_call_function (& fci , & t -> fci_cache );
650
- ch -> in_callback = 0 ;
651
- if (error == FAILURE ) {
652
- php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_FNMATCH_FUNCTION" );
653
- } else if (!Z_ISUNDEF (retval )) {
637
+ ch -> in_callback = true;
638
+ zend_call_known_fcc (& ch -> handlers .fnmatch , & retval , /* param_count */ 3 , argv , /* named_params */ NULL );
639
+ ch -> in_callback = false;
640
+
641
+ if (!Z_ISUNDEF (retval )) {
654
642
_php_curl_verify_handlers (ch , /* reporterror */ true);
643
+ /* TODO Check callback returns an int or something castable to int */
655
644
rval = zval_get_long (& retval );
656
645
}
657
646
zval_ptr_dtor (& argv [0 ]);
@@ -1088,7 +1077,7 @@ void init_curl_handle(php_curl *ch)
1088
1077
ch -> handlers .read = ecalloc (1 , sizeof (php_curl_read ));
1089
1078
ch -> handlers .progress = empty_fcall_info_cache ;
1090
1079
ch -> handlers .xferinfo = empty_fcall_info_cache ;
1091
- ch -> handlers .fnmatch = NULL ;
1080
+ ch -> handlers .fnmatch = empty_fcall_info_cache ;
1092
1081
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
1093
1082
ch -> handlers .sshhostkey = empty_fcall_info_cache ;
1094
1083
#endif
@@ -1212,17 +1201,6 @@ PHP_FUNCTION(curl_init)
1212
1201
}
1213
1202
/* }}} */
1214
1203
1215
- static void _php_copy_callback (php_curl * ch , php_curl_callback * * new_callback , php_curl_callback * source_callback , CURLoption option )
1216
- {
1217
- if (source_callback ) {
1218
- * new_callback = ecalloc (1 , sizeof (php_curl_callback ));
1219
- if (!Z_ISUNDEF (source_callback -> func_name )) {
1220
- ZVAL_COPY (& (* new_callback )-> func_name , & source_callback -> func_name );
1221
- }
1222
- curl_easy_setopt (ch -> cp , option , (void * ) ch );
1223
- }
1224
- }
1225
-
1226
1204
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 )
1227
1205
{
1228
1206
if (ZEND_FCC_INITIALIZED (* source_fcc )) {
@@ -1272,7 +1250,7 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
1272
1250
1273
1251
php_curl_copy_fcc_with_option (ch , CURLOPT_PROGRESSDATA , & ch -> handlers .progress , & source -> handlers .progress );
1274
1252
php_curl_copy_fcc_with_option (ch , CURLOPT_XFERINFODATA , & ch -> handlers .xferinfo , & source -> handlers .xferinfo );
1275
- _php_copy_callback (ch , & ch -> handlers .fnmatch , source -> handlers .fnmatch , CURLOPT_FNMATCH_DATA );
1253
+ php_curl_copy_fcc_with_option (ch , CURLOPT_FNMATCH_DATA , & ch -> handlers .fnmatch , & source -> handlers .fnmatch );
1276
1254
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
1277
1255
php_curl_copy_fcc_with_option (ch , CURLOPT_SSH_HOSTKEYDATA , & ch -> handlers .sshhostkey , & source -> handlers .sshhostkey );
1278
1256
#endif
@@ -2162,6 +2140,18 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2162
2140
break ;
2163
2141
}
2164
2142
2143
+ case CURLOPT_FNMATCH_FUNCTION : {
2144
+ /* Check value is actually a callable and set it */
2145
+ const char option_name [] = "CURLOPT_FNMATCH_FUNCTION" ;
2146
+ bool result = php_curl_set_callable_handler (& ch -> handlers .fnmatch , zvalue , is_array_config , option_name );
2147
+ if (!result ) {
2148
+ return FAILURE ;
2149
+ }
2150
+ curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_FUNCTION , curl_fnmatch );
2151
+ curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_DATA , ch );
2152
+ break ;
2153
+ }
2154
+
2165
2155
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2166
2156
case CURLOPT_SSH_HOSTKEYFUNCTION : {
2167
2157
/* Check value is actually a callable and set it */
@@ -2271,18 +2261,6 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2271
2261
}
2272
2262
break ;
2273
2263
2274
- case CURLOPT_FNMATCH_FUNCTION :
2275
- curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_FUNCTION , curl_fnmatch );
2276
- curl_easy_setopt (ch -> cp , CURLOPT_FNMATCH_DATA , ch );
2277
- if (ch -> handlers .fnmatch == NULL ) {
2278
- ch -> handlers .fnmatch = ecalloc (1 , sizeof (php_curl_callback ));
2279
- } else if (!Z_ISUNDEF (ch -> handlers .fnmatch -> func_name )) {
2280
- zval_ptr_dtor (& ch -> handlers .fnmatch -> func_name );
2281
- ch -> handlers .fnmatch -> fci_cache = empty_fcall_info_cache ;
2282
- }
2283
- ZVAL_COPY (& ch -> handlers .fnmatch -> func_name , zvalue );
2284
- break ;
2285
-
2286
2264
/* Curl blob options */
2287
2265
#if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */
2288
2266
case CURLOPT_ISSUERCERT_BLOB :
@@ -2771,14 +2749,6 @@ PHP_FUNCTION(curl_close)
2771
2749
}
2772
2750
/* }}} */
2773
2751
2774
- static void _php_curl_free_callback (php_curl_callback * callback )
2775
- {
2776
- if (callback ) {
2777
- zval_ptr_dtor (& callback -> func_name );
2778
- efree (callback );
2779
- }
2780
- }
2781
-
2782
2752
static void curl_free_obj (zend_object * object )
2783
2753
{
2784
2754
php_curl * ch = curl_from_obj (object );
@@ -2845,7 +2815,9 @@ static void curl_free_obj(zend_object *object)
2845
2815
if (ZEND_FCC_INITIALIZED (ch -> handlers .xferinfo )) {
2846
2816
zend_fcc_dtor (& ch -> handlers .xferinfo );
2847
2817
}
2848
- _php_curl_free_callback (ch -> handlers .fnmatch );
2818
+ if (ZEND_FCC_INITIALIZED (ch -> handlers .fnmatch )) {
2819
+ zend_fcc_dtor (& ch -> handlers .fnmatch );
2820
+ }
2849
2821
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2850
2822
if (ZEND_FCC_INITIALIZED (ch -> handlers .sshhostkey )) {
2851
2823
zend_fcc_dtor (& ch -> handlers .sshhostkey );
@@ -2922,10 +2894,8 @@ static void _php_curl_reset_handlers(php_curl *ch)
2922
2894
ch -> handlers .xferinfo .function_handler = NULL ;
2923
2895
}
2924
2896
2925
- if (ch -> handlers .fnmatch ) {
2926
- zval_ptr_dtor (& ch -> handlers .fnmatch -> func_name );
2927
- efree (ch -> handlers .fnmatch );
2928
- ch -> handlers .fnmatch = NULL ;
2897
+ if (ZEND_FCC_INITIALIZED (ch -> handlers .fnmatch )) {
2898
+ zend_fcc_dtor (& ch -> handlers .fnmatch );
2929
2899
}
2930
2900
2931
2901
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
0 commit comments