diff --git a/NEWS b/NEWS index ad3bcc47ed2..a316642ce1d 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,10 @@ PHP NEWS . Fixed bug GH-17403 (Potential deadlock when putenv fails). (nielsdos) . Fixed bug GH-18400 (http_build_query type error is inaccurate). (nielsdos) +- Zip: + . Fixed bug GH-18431 (Registering ZIP progress callback twice doesn't work). + (nielsdos) + 24 Apr 2025, PHP 8.4.7 - Core: diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 45b9e2f9c74..b0a32e96589 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -3054,14 +3054,11 @@ PHP_METHOD(ZipArchive, registerProgressCallback) obj = Z_ZIP_P(self); - /* free if called twice */ - _php_zip_progress_callback_free(obj); - /* register */ - ZVAL_COPY(&obj->progress_callback, &fci.function_name); if (zip_register_progress_callback_with_state(intern, rate, _php_zip_progress_callback, _php_zip_progress_callback_free, obj)) { RETURN_FALSE; } + ZVAL_COPY(&obj->progress_callback, &fci.function_name); RETURN_TRUE; } @@ -3099,14 +3096,11 @@ PHP_METHOD(ZipArchive, registerCancelCallback) obj = Z_ZIP_P(self); - /* free if called twice */ - _php_zip_cancel_callback_free(obj); - /* register */ - ZVAL_COPY(&obj->cancel_callback, &fci.function_name); if (zip_register_cancel_callback_with_state(intern, _php_zip_cancel_callback, _php_zip_cancel_callback_free, obj)) { RETURN_FALSE; } + ZVAL_COPY(&obj->cancel_callback, &fci.function_name); RETURN_TRUE; } diff --git a/ext/zip/tests/gh18431.phpt b/ext/zip/tests/gh18431.phpt new file mode 100644 index 00000000000..d4eb89c36c6 --- /dev/null +++ b/ext/zip/tests/gh18431.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-18431 (Registering ZIP progress callback twice doesn't work) +--EXTENSIONS-- +zip +--FILE-- +open($file, ZIPARCHIVE::CREATE); +$zip->registerProgressCallback(0.5, $callback); +$zip->registerProgressCallback(0.5, $callback); +$zip->addFromString('foo', 'entry #1'); +?> +--CLEAN-- + +--EXPECT-- +float(0) +float(1)