diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index cb032095c392d..17d6c3c64fd2a 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2281,6 +2281,7 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert } if (FAILURE == phar_copy_file_contents(&newentry, phar->fp)) { + phar_metadata_tracker_free(&phar->metadata_tracker, phar->is_persistent); zend_hash_destroy(&(phar->manifest)); php_stream_close(phar->fp); efree(phar); @@ -2318,6 +2319,7 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert return ret; } else { if(phar != NULL) { + phar_metadata_tracker_free(&phar->metadata_tracker, phar->is_persistent); zend_hash_destroy(&(phar->manifest)); zend_hash_destroy(&(phar->mounted_dirs)); zend_hash_destroy(&(phar->virtual_dirs)); diff --git a/ext/phar/tests/phar_convert_metadata_leak.phpt b/ext/phar/tests/phar_convert_metadata_leak.phpt new file mode 100644 index 0000000000000..61a240c8888da --- /dev/null +++ b/ext/phar/tests/phar_convert_metadata_leak.phpt @@ -0,0 +1,24 @@ +--TEST-- +Phar convert logic leaks metadata +--EXTENSIONS-- +phar +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +setMetadata("foobar"); +$phar['x'] = 'hi'; +try { + $phar->convertToData(Phar::ZIP, Phar::NONE, 'phar.zip'); +} catch (BadMethodCallException $e) { + echo $e->getMessage(),"\n"; +} +?> +--CLEAN-- + +--EXPECTF-- +data phar "%s" has invalid extension phar.zip