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)) {
|
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;
|
entry->phar->metadata = entry->metadata;
|
||||||
ZVAL_UNDEF(&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)))) {
|
} 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 */
|
/* transfer this metadata to the entry it refers */
|
||||||
mentry->metadata = entry->metadata;
|
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);
|
return phar_tar_setmetadata(&entry->phar->metadata, entry, error TSRMLS_CC);
|
||||||
}
|
}
|
||||||
/* search for the file this metadata entry references */
|
/* 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))) {
|
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 */
|
/* this is orphaned metadata, erase it */
|
||||||
return ZEND_HASH_APPLY_REMOVE;
|
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(&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[1], *signature, *signature_len);
|
||||||
ZVAL_STRINGL(&zp[2], key, key_len);
|
ZVAL_STRINGL(&zp[2], key, key_len);
|
||||||
|
php_stream_rewind(fp);
|
||||||
str = php_stream_copy_to_mem(fp, (size_t) end, 0);
|
str = php_stream_copy_to_mem(fp, (size_t) end, 0);
|
||||||
if (str) {
|
if (str) {
|
||||||
ZVAL_STR(&zp[0], 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]);
|
Z_DELREF(zp[2]);
|
||||||
|
|
||||||
zval_dtor(&zp[0]);
|
zval_dtor(&zp[0]);
|
||||||
zval_dtor(&zp[1]);
|
zval_dtor(&zp[2]);
|
||||||
|
|
||||||
switch (Z_TYPE(retval)) {
|
switch (Z_TYPE(retval)) {
|
||||||
default:
|
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) /* {{{ */
|
static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
|
||||||
{
|
{
|
||||||
phar_archive_data *phar;
|
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_hash_init(&newmanifest, sizeof(phar_entry_info),
|
||||||
zend_get_hash_value, destroy_phar_manifest_entry, 0);
|
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, phar_manifest_copy_ctor);
|
||||||
zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL);
|
|
||||||
zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar TSRMLS_CC);
|
zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar TSRMLS_CC);
|
||||||
phar->manifest = newmanifest;
|
phar->manifest = newmanifest;
|
||||||
zend_hash_init(&phar->mounted_dirs, sizeof(char *),
|
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) /* {{{ */
|
int phar_copy_on_write(phar_archive_data **pphar TSRMLS_DC) /* {{{ */
|
||||||
{
|
{
|
||||||
|
zval zv, *pzv;
|
||||||
phar_archive_data *newpphar;
|
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;
|
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 */
|
/* invalidate phar cache */
|
||||||
PHAR_G(last_phar) = NULL;
|
PHAR_G(last_phar) = NULL;
|
||||||
PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
|
PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user