]> granicus.if.org Git - php/commit
[RFC] Only unserialize Phar metadata when getMetadata() is called
authorTyson Andre <tysonandre775@hotmail.com>
Tue, 7 Jul 2020 22:47:52 +0000 (18:47 -0400)
committerTyson Andre <tysonandre775@hotmail.com>
Mon, 3 Aug 2020 17:28:51 +0000 (13:28 -0400)
commit0c238ede019f6ffbe7c996ec1695a747f4bca966
treee808fc0f2b31d73f42d80f51087d611c98673142
parentf9f769d4b9af367af864d35cf09dca5b08da2046
[RFC] Only unserialize Phar metadata when getMetadata() is called

In other words, don't automatically unserialize when the magic
phar:// stream wrappers are used.
RFC: https://wiki.php.net/rfc/phar_stop_autoloading_metadata

Also, change the signature from `getMetadata()`
to `getMetadata(array $unserialize_options = [])`.
Start throwing earlier if setMetadata() is called and serialization threw.

See https://externals.io/message/110856 and
https://bugs.php.net/bug.php?id=76774

This was refactored to add a phar_metadata_tracker for the following reasons:
- The way to properly copy a zval was previously implicit and undocumented
  (e.g. is it a pointer to a raw string or an actual value)
- Avoid unnecessary serialization and unserialization in the most common case
- If a metadata value is serialized once while saving a new/modified phar file,
  this allows reusing the same serialized string.
- Have as few ways to copy/clone/lazily parse metadata (etc.) as possible,
  so that code changes can be limited to only a few places in the future.
- Performance is hopefully not a concern - copying a string should be faster
  than unserializing a value, and metadata should be rare in most cases.

Remove unnecessary skip in a test(Compression's unused)

Add additional assertions about usage of persistent phars

Improve robustness of `Phar*->setMetadata()`

- Add sanity checks for edge cases freeing metadata, when destructors
  or serializers modify the phar recursively.
- Typical use cases of php have phar.readonly=1 and would not be affected.

Closes GH-5855
19 files changed:
UPGRADING
ext/phar/phar.c
ext/phar/phar_internal.h
ext/phar/phar_object.c
ext/phar/phar_object.stub.php
ext/phar/phar_object_arginfo.h
ext/phar/stream.c
ext/phar/tar.c
ext/phar/tests/bug69720.phpt
ext/phar/tests/bug69958.phpt
ext/phar/tests/phar_metadata_write2.phpt [new file with mode: 0644]
ext/phar/tests/phar_metadata_write3.phpt [new file with mode: 0644]
ext/phar/tests/phar_metadata_write4.phpt [new file with mode: 0644]
ext/phar/tests/tar/all.phpt
ext/phar/tests/tar/bug70417.phpt
ext/phar/util.c
ext/phar/zip.c
ext/standard/php_var.h
ext/standard/var.c