mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Support for ext/phar (all tests passed)
This commit is contained in:
parent
dda4140010
commit
f29b68306d
@ -180,7 +180,6 @@ static int phar_tar_process_metadata(phar_entry_info *entry, php_stream *fp TSRM
|
||||
if (entry->filename_len == sizeof(".phar/.metadata.bin")-1 && !memcmp(entry->filename, ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1)) {
|
||||
entry->phar->metadata = entry->metadata;
|
||||
ZVAL_UNDEF(&entry->metadata);
|
||||
// ??? len ???
|
||||
} else if (entry->filename_len >= sizeof(".phar/.metadata/") + sizeof("/.metadata.bin") - 1 && NULL != (mentry = zend_hash_str_find_ptr(&(entry->phar->manifest), entry->filename + sizeof(".phar/.metadata/") - 1, entry->filename_len - (sizeof("/.metadata.bin") - 1 + sizeof(".phar/.metadata/") - 1)))) {
|
||||
/* transfer this metadata to the entry it refers */
|
||||
mentry->metadata = entry->metadata;
|
||||
@ -878,7 +877,6 @@ static int phar_tar_setupmetadata(zval *zv, void *argument TSRMLS_DC) /* {{{ */
|
||||
return phar_tar_setmetadata(&entry->phar->metadata, entry, error TSRMLS_CC);
|
||||
}
|
||||
/* search for the file this metadata entry references */
|
||||
//??? len ???
|
||||
if (entry->filename_len >= sizeof(".phar/.metadata/") + sizeof("/.metadata.bin") - 1 && !zend_hash_str_exists(&(entry->phar->manifest), entry->filename + sizeof(".phar/.metadata/") - 1, entry->filename_len - (sizeof("/.metadata.bin") - 1 + sizeof(".phar/.metadata/") - 1))) {
|
||||
/* this is orphaned metadata, erase it */
|
||||
return ZEND_HASH_APPLY_REMOVE;
|
||||
|
@ -1398,6 +1398,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end,
|
||||
ZVAL_STRINGL(&openssl, is_sign ? "openssl_sign" : "openssl_verify", is_sign ? sizeof("openssl_sign")-1 : sizeof("openssl_verify")-1);
|
||||
ZVAL_STRINGL(&zp[1], *signature, *signature_len);
|
||||
ZVAL_STRINGL(&zp[2], key, key_len);
|
||||
php_stream_rewind(fp);
|
||||
str = php_stream_copy_to_mem(fp, (size_t) end, 0);
|
||||
if (str) {
|
||||
ZVAL_STR(&zp[0], str);
|
||||
@ -1452,7 +1453,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end,
|
||||
Z_DELREF(zp[2]);
|
||||
|
||||
zval_dtor(&zp[0]);
|
||||
zval_dtor(&zp[1]);
|
||||
zval_dtor(&zp[2]);
|
||||
|
||||
switch (Z_TYPE(retval)) {
|
||||
default:
|
||||
@ -1970,6 +1971,14 @@ static int phar_update_cached_entry(zval *data, void *argument) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void phar_manifest_copy_ctor(zval *zv) /* {{{ */
|
||||
{
|
||||
phar_entry_info *info = emalloc(sizeof(phar_entry_info));
|
||||
memcpy(info, Z_PTR_P(zv), sizeof(phar_entry_info));
|
||||
Z_PTR_P(zv) = info;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
phar_archive_data *phar;
|
||||
@ -2005,8 +2014,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
|
||||
|
||||
zend_hash_init(&newmanifest, sizeof(phar_entry_info),
|
||||
zend_get_hash_value, destroy_phar_manifest_entry, 0);
|
||||
//??? zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL, NULL, sizeof(phar_entry_info));
|
||||
zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL);
|
||||
zend_hash_copy(&newmanifest, &(*pphar)->manifest, phar_manifest_copy_ctor);
|
||||
zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar TSRMLS_CC);
|
||||
phar->manifest = newmanifest;
|
||||
zend_hash_init(&phar->mounted_dirs, sizeof(char *),
|
||||
@ -2027,13 +2035,16 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
|
||||
|
||||
int phar_copy_on_write(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zval zv, *pzv;
|
||||
phar_archive_data *newpphar;
|
||||
|
||||
if (NULL == (newpphar = zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_fname_map), (*pphar)->fname, (*pphar)->fname_len, *pphar))) {
|
||||
ZVAL_PTR(&zv, *pphar);
|
||||
if (NULL == (pzv = zend_hash_str_add(&(PHAR_GLOBALS->phar_fname_map), (*pphar)->fname, (*pphar)->fname_len, &zv))) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
phar_copy_cached_phar(&newpphar TSRMLS_CC);
|
||||
phar_copy_cached_phar(&Z_PTR_P(pzv) TSRMLS_CC);
|
||||
newpphar = Z_PTR_P(pzv);
|
||||
/* invalidate phar cache */
|
||||
PHAR_G(last_phar) = NULL;
|
||||
PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user