diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 4e25a151d3a..012fa5eedad 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -3070,10 +3070,12 @@ static int php_zip_cancel_callback(zip_t *arch, void *ptr) ze_zip_object *obj = ptr; zend_call_known_fcc(&obj->cancel_callback, &cb_retval, 0, NULL, NULL); - if (!Z_ISUNDEF(cb_retval)) { - retval = zval_get_long(&cb_retval); - zval_ptr_dtor(&cb_retval); + if (Z_ISUNDEF(cb_retval)) { + /* Cancel if an exception has been thrown */ + return -1; } + retval = zval_get_long(&cb_retval); + zval_ptr_dtor(&cb_retval); return retval; } diff --git a/ext/zip/tests/oo_cancel_trampoline.phpt b/ext/zip/tests/oo_cancel_trampoline.phpt index 77a52637fc4..2ea26c2cd7d 100644 --- a/ext/zip/tests/oo_cancel_trampoline.phpt +++ b/ext/zip/tests/oo_cancel_trampoline.phpt @@ -91,7 +91,9 @@ ValueError: Invalid or uninitialized Zip object bool(true) bool(true) Trampoline for trampolineThrow + +Warning: ZipArchive::close(): Operation cancelled in %s on line %d Exception: boo -bool(false) -string(8) "No error" +bool(true) +string(19) "Operation cancelled" Done