@@ -1030,13 +1030,12 @@ static void php_zip_progress_callback_free(void *ptr)
1030
1030
#endif
1031
1031
1032
1032
#ifdef HAVE_CANCEL_CALLBACK
1033
- static void _php_zip_cancel_callback_free (void * ptr )
1033
+ static void php_zip_cancel_callback_free (void * ptr )
1034
1034
{
1035
1035
ze_zip_object * obj = ptr ;
1036
1036
1037
- if (!Z_ISUNDEF (obj -> cancel_callback )) {
1038
- zval_ptr_dtor (& obj -> cancel_callback );
1039
- ZVAL_UNDEF (& obj -> cancel_callback );
1037
+ if (ZEND_FCC_INITIALIZED (obj -> cancel_callback )) {
1038
+ zend_fcc_dtor (& obj -> cancel_callback );
1040
1039
}
1041
1040
}
1042
1041
#endif
@@ -1070,7 +1069,7 @@ static void php_zip_object_free_storage(zend_object *object) /* {{{ */
1070
1069
1071
1070
#ifdef HAVE_CANCEL_CALLBACK
1072
1071
/* if not properly called by libzip */
1073
- _php_zip_cancel_callback_free (intern );
1072
+ php_zip_cancel_callback_free (intern );
1074
1073
#endif
1075
1074
1076
1075
intern -> za = NULL ;
@@ -3064,13 +3063,14 @@ PHP_METHOD(ZipArchive, registerProgressCallback)
3064
3063
#endif
3065
3064
3066
3065
#ifdef HAVE_CANCEL_CALLBACK
3067
- static int _php_zip_cancel_callback (zip_t * arch , void * ptr )
3066
+ static int php_zip_cancel_callback (zip_t * arch , void * ptr )
3068
3067
{
3069
3068
zval cb_retval ;
3070
3069
int retval = 0 ;
3071
3070
ze_zip_object * obj = ptr ;
3072
3071
3073
- if (call_user_function (EG (function_table ), NULL , & obj -> cancel_callback , & cb_retval , 0 , NULL ) == SUCCESS && !Z_ISUNDEF (cb_retval )) {
3072
+ zend_call_known_fcc (& obj -> cancel_callback , & cb_retval , 0 , NULL , NULL );
3073
+ if (!Z_ISUNDEF (cb_retval )) {
3074
3074
retval = zval_get_long (& cb_retval );
3075
3075
zval_ptr_dtor (& cb_retval );
3076
3076
}
@@ -3082,24 +3082,28 @@ static int _php_zip_cancel_callback(zip_t *arch, void *ptr)
3082
3082
PHP_METHOD (ZipArchive , registerCancelCallback )
3083
3083
{
3084
3084
struct zip * intern ;
3085
- zval * self = ZEND_THIS ;
3086
- zend_fcall_info fci ;
3085
+ zend_fcall_info dummy_fci ;
3087
3086
zend_fcall_info_cache fcc ;
3088
3087
ze_zip_object * obj ;
3089
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "f " , & fci , & fcc ) == FAILURE ) {
3088
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "F " , & dummy_fci , & fcc ) == FAILURE ) {
3090
3089
RETURN_THROWS ();
3091
3090
}
3092
3091
3093
- ZIP_FROM_OBJECT (intern , self );
3094
-
3095
- obj = Z_ZIP_P (self );
3092
+ /* Inline ZIP_FROM_OBJECT(intern, self); */
3093
+ obj = Z_ZIP_P (ZEND_THIS );
3094
+ intern = obj -> za ;
3095
+ if (!intern ) { \
3096
+ zend_value_error ("Invalid or uninitialized Zip object" );
3097
+ zend_release_fcall_info_cache (& fcc );
3098
+ RETURN_THROWS ();
3099
+ }
3096
3100
3097
3101
/* free if called twice */
3098
- _php_zip_cancel_callback_free (obj );
3102
+ php_zip_cancel_callback_free (obj );
3099
3103
3100
3104
/* register */
3101
- ZVAL_COPY (& obj -> cancel_callback , & fci . function_name );
3102
- if (zip_register_cancel_callback_with_state (intern , _php_zip_cancel_callback , _php_zip_cancel_callback_free , obj )) {
3105
+ zend_fcc_dup (& obj -> cancel_callback , & fcc );
3106
+ if (zip_register_cancel_callback_with_state (intern , php_zip_cancel_callback , php_zip_cancel_callback_free , obj )) {
3103
3107
RETURN_FALSE ;
3104
3108
}
3105
3109
0 commit comments