diff options
Diffstat (limited to 'ext/phar/phar.c')
| -rw-r--r-- | ext/phar/phar.c | 242 |
1 files changed, 119 insertions, 123 deletions
diff --git a/ext/phar/phar.c b/ext/phar/phar.c index a23c1b89c2..05a90fc2df 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -24,7 +24,7 @@ #include "SAPI.h" #include "func_interceptors.h" -static void destroy_phar_data(void *pDest); +static void destroy_phar_data(zval *zv); ZEND_DECLARE_MODULE_GLOBALS(phar) char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); @@ -32,10 +32,10 @@ char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC /** * set's phar->is_writeable based on the current INI value */ -static int phar_set_writeable_bit(void *pDest, void *argument TSRMLS_DC) /* {{{ */ +static int phar_set_writeable_bit(zval *zv, void *argument TSRMLS_DC) /* {{{ */ { zend_bool keep = *(zend_bool *)argument; - phar_archive_data *phar = *(phar_archive_data **)pDest; + phar_archive_data *phar = (phar_archive_data *)Z_PTR_P(zv); if (!phar->is_data) { phar->is_writeable = !keep; @@ -115,12 +115,11 @@ static void phar_split_cache_list(TSRMLS_D) /* {{{ */ /* fake request startup */ PHAR_GLOBALS->request_init = 1; - if (zend_hash_init(&EG(regular_list), 0, NULL, NULL, 0) == SUCCESS) { - EG(regular_list).nNextFreeElement=1; /* we don't want resource id 0 */ - } + zend_hash_init(&EG(regular_list), 0, NULL, NULL, 0); + EG(regular_list).nNextFreeElement=1; /* we don't want resource id 0 */ - PHAR_G(has_bz2) = zend_hash_exists(&module_registry, "bz2", sizeof("bz2")); - PHAR_G(has_zlib) = zend_hash_exists(&module_registry, "zlib", sizeof("zlib")); + PHAR_G(has_bz2) = zend_hash_str_exists(&module_registry, "bz2", sizeof("bz2")-1); + PHAR_G(has_zlib) = zend_hash_str_exists(&module_registry, "zlib", sizeof("zlib")-1); /* these two are dummies and will be destroyed later */ zend_hash_init(&cached_phars, sizeof(phar_archive_data*), zend_get_hash_value, destroy_phar_data, 1); zend_hash_init(&cached_alias, sizeof(phar_archive_data*), zend_get_hash_value, NULL, 1); @@ -236,11 +235,11 @@ void phar_destroy_phar_data(phar_archive_data *phar TSRMLS_DC) /* {{{ */ phar->virtual_dirs.arHash = NULL; } - if (phar->metadata) { + if (Z_TYPE(phar->metadata) != IS_UNDEF) { if (phar->is_persistent) { if (phar->metadata_len) { /* for zip comments that are strings */ - free(phar->metadata); + free(Z_PTR(phar->metadata)); } else { zval_internal_ptr_dtor(&phar->metadata); } @@ -248,7 +247,7 @@ void phar_destroy_phar_data(phar_archive_data *phar TSRMLS_DC) /* {{{ */ zval_ptr_dtor(&phar->metadata); } phar->metadata_len = 0; - phar->metadata = 0; + ZVAL_UNDEF(&phar->metadata); } if (phar->fp) { @@ -276,7 +275,7 @@ int phar_archive_delref(phar_archive_data *phar TSRMLS_DC) /* {{{ */ if (--phar->refcount < 0) { if (PHAR_GLOBALS->request_done - || zend_hash_del(&(PHAR_GLOBALS->phar_fname_map), phar->fname, phar->fname_len) != SUCCESS) { + || zend_hash_str_del(&(PHAR_GLOBALS->phar_fname_map), phar->fname, phar->fname_len) != SUCCESS) { phar_destroy_phar_data(phar TSRMLS_CC); } return 1; @@ -297,7 +296,7 @@ int phar_archive_delref(phar_archive_data *phar TSRMLS_DC) /* {{{ */ if (!zend_hash_num_elements(&phar->manifest)) { /* this is a new phar that has perhaps had an alias/metadata set, but has never been flushed */ - if (zend_hash_del(&(PHAR_GLOBALS->phar_fname_map), phar->fname, phar->fname_len) != SUCCESS) { + if (zend_hash_str_del(&(PHAR_GLOBALS->phar_fname_map), phar->fname, phar->fname_len) != SUCCESS) { phar_destroy_phar_data(phar TSRMLS_CC); } return 1; @@ -310,9 +309,9 @@ int phar_archive_delref(phar_archive_data *phar TSRMLS_DC) /* {{{ */ /** * Destroy phar's in shutdown, here we don't care about aliases */ -static void destroy_phar_data_only(void *pDest) /* {{{ */ +static void destroy_phar_data_only(zval *zv) /* {{{ */ { - phar_archive_data *phar_data = *(phar_archive_data **) pDest; + phar_archive_data *phar_data = (phar_archive_data *) Z_PTR_P(zv); TSRMLS_FETCH(); if (EG(exception) || --phar_data->refcount < 0) { @@ -324,18 +323,18 @@ static void destroy_phar_data_only(void *pDest) /* {{{ */ /** * Delete aliases to phar's that got kicked out of the global table */ -static int phar_unalias_apply(void *pDest, void *argument TSRMLS_DC) /* {{{ */ +static int phar_unalias_apply(zval *zv, void *argument TSRMLS_DC) /* {{{ */ { - return *(void**)pDest == argument ? ZEND_HASH_APPLY_REMOVE : ZEND_HASH_APPLY_KEEP; + return Z_PTR_P(zv) == argument ? ZEND_HASH_APPLY_REMOVE : ZEND_HASH_APPLY_KEEP; } /* }}} */ /** * Delete aliases to phar's that got kicked out of the global table */ -static int phar_tmpclose_apply(void *pDest TSRMLS_DC) /* {{{ */ +static int phar_tmpclose_apply(zval *zv TSRMLS_DC) /* {{{ */ { - phar_entry_info *entry = (phar_entry_info *) pDest; + phar_entry_info *entry = (phar_entry_info *) Z_PTR_P(zv); if (entry->fp_type != PHAR_TMP) { return ZEND_HASH_APPLY_KEEP; @@ -353,16 +352,16 @@ static int phar_tmpclose_apply(void *pDest TSRMLS_DC) /* {{{ */ /** * Filename map destructor */ -static void destroy_phar_data(void *pDest) /* {{{ */ +static void destroy_phar_data(zval *zv) /* {{{ */ { - phar_archive_data *phar_data = *(phar_archive_data **) pDest; + phar_archive_data *phar_data = (phar_archive_data *)Z_PTR_P(zv); TSRMLS_FETCH(); if (PHAR_GLOBALS->request_ends) { /* first, iterate over the manifest and close all PHAR_TMP entry fp handles, this prevents unnecessary unfreed stream resources */ zend_hash_apply(&(phar_data->manifest), phar_tmpclose_apply TSRMLS_CC); - destroy_phar_data_only(pDest); + destroy_phar_data_only(zv); return; } @@ -377,9 +376,9 @@ static void destroy_phar_data(void *pDest) /* {{{ */ /** * destructor for the manifest hash, frees each file's entry */ -void destroy_phar_manifest_entry(void *pDest) /* {{{ */ +void destroy_phar_manifest_entry(zval *zv) /* {{{ */ { - phar_entry_info *entry = (phar_entry_info *)pDest; + phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv); TSRMLS_FETCH(); if (entry->cfp) { @@ -392,11 +391,11 @@ void destroy_phar_manifest_entry(void *pDest) /* {{{ */ entry->fp = 0; } - if (entry->metadata) { + if (Z_TYPE(entry->metadata) != IS_UNDEF) { if (entry->is_persistent) { if (entry->metadata_len) { /* for zip comments that are strings */ - free(entry->metadata); + free(Z_PTR(entry->metadata)); } else { zval_internal_ptr_dtor(&entry->metadata); } @@ -404,12 +403,12 @@ void destroy_phar_manifest_entry(void *pDest) /* {{{ */ zval_ptr_dtor(&entry->metadata); } entry->metadata_len = 0; - entry->metadata = 0; + ZVAL_UNDEF(&entry->metadata); } - if (entry->metadata_str.c) { + if (entry->metadata_str.s) { smart_str_free(&entry->metadata_str); - entry->metadata_str.c = 0; + entry->metadata_str.s = NULL; } pefree(entry->filename, entry->is_persistent); @@ -423,6 +422,8 @@ void destroy_phar_manifest_entry(void *pDest) /* {{{ */ pefree(entry->tmp, entry->is_persistent); entry->tmp = 0; } + + pefree(entry, entry->is_persistent); } /* }}} */ @@ -464,7 +465,7 @@ void phar_entry_remove(phar_entry_data *idata, char **error TSRMLS_DC) /* {{{ */ if (idata->fp && idata->fp != idata->phar->fp && idata->fp != idata->phar->ufp && idata->fp != idata->internal_file->fp) { php_stream_close(idata->fp); } - zend_hash_del(&idata->phar->manifest, idata->internal_file->filename, idata->internal_file->filename_len); + zend_hash_str_del(&idata->phar->manifest, idata->internal_file->filename, idata->internal_file->filename_len); idata->phar->refcount--; efree(idata); } else { @@ -562,7 +563,7 @@ int phar_open_parsed_phar(char *fname, int fname_len, char *alias, int alias_len if (!is_data) { /* prevent any ".phar" without a stub getting through */ if (!phar->halt_offset && !phar->is_brandnew && (phar->is_tar || phar->is_zip)) { - if (PHAR_G(readonly) && FAILURE == zend_hash_find(&(phar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1, (void **)&stub)) { + if (PHAR_G(readonly) && NULL == (stub = zend_hash_str_find_ptr(&(phar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1))) { if (error) { spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname); } @@ -601,7 +602,7 @@ int phar_open_parsed_phar(char *fname, int fname_len, char *alias, int alias_len * * data is the serialized zval */ -int phar_parse_metadata(char **buffer, zval **metadata, int zip_metadata_len TSRMLS_DC) /* {{{ */ +int phar_parse_metadata(char **buffer, zval *metadata, int zip_metadata_len TSRMLS_DC) /* {{{ */ { const unsigned char *p; php_uint32 buf_len; @@ -614,15 +615,14 @@ int phar_parse_metadata(char **buffer, zval **metadata, int zip_metadata_len TSR } if (buf_len) { - ALLOC_ZVAL(*metadata); - INIT_ZVAL(**metadata); + ZVAL_NULL(metadata); p = (const unsigned char*) *buffer; PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(metadata, &p, p + buf_len, &var_hash TSRMLS_CC)) { PHP_VAR_UNSERIALIZE_DESTROY(var_hash); zval_ptr_dtor(metadata); - *metadata = NULL; + ZVAL_UNDEF(metadata); return FAILURE; } @@ -631,13 +631,13 @@ int phar_parse_metadata(char **buffer, zval **metadata, int zip_metadata_len TSR if (PHAR_G(persist)) { /* lazy init metadata */ zval_ptr_dtor(metadata); - *metadata = (zval *) pemalloc(buf_len, 1); - memcpy(*metadata, *buffer, buf_len); + Z_PTR_P(metadata) = pemalloc(buf_len, 1); + memcpy(Z_PTR_P(metadata), *buffer, buf_len); *buffer += buf_len; return SUCCESS; } } else { - *metadata = NULL; + ZVAL_UNDEF(metadata); } if (!zip_metadata_len) { @@ -1129,9 +1129,9 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char switch (entry.flags & PHAR_ENT_COMPRESSION_MASK) { case PHAR_ENT_COMPRESSED_GZ: if (!PHAR_G(has_zlib)) { - if (entry.metadata) { + if (Z_TYPE(entry.metadata) != IS_UNDEF) { if (entry.is_persistent) { - free(entry.metadata); + free(Z_PTR(entry.metadata)); } else { zval_ptr_dtor(&entry.metadata); } @@ -1142,9 +1142,9 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char break; case PHAR_ENT_COMPRESSED_BZ2: if (!PHAR_G(has_bz2)) { - if (entry.metadata) { + if (Z_TYPE(entry.metadata) != IS_UNDEF) { if (entry.is_persistent) { - free(entry.metadata); + free(Z_PTR(entry.metadata)); } else { zval_ptr_dtor(&entry.metadata); } @@ -1155,9 +1155,9 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char break; default: if (entry.uncompressed_filesize != entry.compressed_filesize) { - if (entry.metadata) { + if (Z_TYPE(entry.metadata) != IS_UNDEF) { if (entry.is_persistent) { - free(entry.metadata); + free(Z_PTR(entry.metadata)); } else { zval_ptr_dtor(&entry.metadata); } @@ -1172,7 +1172,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char /* if signature matched, no need to check CRC32 for each file */ entry.is_crc_checked = (manifest_flags & PHAR_HDR_SIGNATURE ? 1 : 0); phar_set_inode(&entry TSRMLS_CC); - zend_hash_add(&mydata->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL); + zend_hash_str_add_mem(&mydata->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info)); } snprintf(mydata->version, sizeof(mydata->version), "%u.%u.%u", manifest_ver >> 12, (manifest_ver >> 8) & 0xF, (manifest_ver >> 4) & 0xF); @@ -1202,7 +1202,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char phar_request_initialize(TSRMLS_C); if (register_alias) { - phar_archive_data **fd_ptr; + phar_archive_data *fd_ptr; mydata->is_temporary_alias = temp_alias; @@ -1212,20 +1212,20 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char MAPPHAR_FAIL("Cannot open archive \"%s\", invalid alias"); } - if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void **)&fd_ptr)) { - if (SUCCESS != phar_free_alias(*fd_ptr, alias, alias_len TSRMLS_CC)) { + if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len))) { + if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len TSRMLS_CC)) { signature = NULL; fp = NULL; MAPPHAR_FAIL("Cannot open archive \"%s\", alias is already in use by existing archive"); } } - zend_hash_add(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void*)&mydata, sizeof(phar_archive_data*), NULL); + zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, mydata); } else { mydata->is_temporary_alias = 1; } - zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len, (void*)&mydata, sizeof(phar_archive_data*), NULL); + zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len, mydata); efree(savebuf); if (pphar) { @@ -1283,7 +1283,7 @@ check_file: if (PHAR_G(readonly) && !(*test)->is_data && ((*test)->is_tar || (*test)->is_zip)) { phar_entry_info *stub; - if (FAILURE == zend_hash_find(&((*test)->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1, (void **)&stub)) { + if (NULL == (stub = zend_hash_str_find_ptr(&((*test)->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1))) { spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname); return FAILURE; } @@ -1410,7 +1410,7 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a mydata->is_writeable = 1; mydata->is_brandnew = 1; phar_request_initialize(TSRMLS_C); - zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len, (void*)&mydata, sizeof(phar_archive_data*), NULL); + zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len, mydata); if (is_data) { alias = NULL; @@ -1419,15 +1419,15 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a /* assume tar format, PharData can specify other */ mydata->is_tar = 1; } else { - phar_archive_data **fd_ptr; + phar_archive_data *fd_ptr; - if (alias && SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void **)&fd_ptr)) { - if (SUCCESS != phar_free_alias(*fd_ptr, alias, alias_len TSRMLS_CC)) { + if (alias && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len))) { + if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len TSRMLS_CC)) { if (error) { spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", mydata->fname, alias); } - zend_hash_del(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len); + zend_hash_str_del(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len); if (pphar) { *pphar = NULL; @@ -1442,14 +1442,14 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a } if (alias_len && alias) { - if (FAILURE == zend_hash_add(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void*)&mydata, sizeof(phar_archive_data*), NULL)) { + if (NULL == zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, mydata)) { if (options & REPORT_ERRORS) { if (error) { spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", fname, alias); } } - zend_hash_del(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len); + zend_hash_str_del(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len); if (pphar) { *pphar = NULL; @@ -1743,13 +1743,13 @@ static int phar_analyze_path(const char *fname, const char *ext, int ext_len, in #ifdef PHP_WIN32 phar_unixify_path_separators(realpath, strlen(realpath)); #endif - if (zend_hash_exists(&(PHAR_GLOBALS->phar_fname_map), realpath, strlen(realpath))) { + if (zend_hash_str_exists(&(PHAR_GLOBALS->phar_fname_map), realpath, strlen(realpath))) { efree(realpath); efree(filename); return SUCCESS; } - if (PHAR_G(manifest_cached) && zend_hash_exists(&cached_phars, realpath, strlen(realpath))) { + if (PHAR_G(manifest_cached) && zend_hash_str_exists(&cached_phars, realpath, strlen(realpath))) { efree(realpath); efree(filename); return SUCCESS; @@ -1912,13 +1912,13 @@ int phar_detect_phar_fname_ext(const char *filename, int filename_len, const cha *ext_str = NULL; return FAILURE; } - if (zend_hash_exists(&(PHAR_GLOBALS->phar_alias_map), (char *) filename, pos - filename)) { + if (zend_hash_str_exists(&(PHAR_GLOBALS->phar_alias_map), (char *) filename, pos - filename)) { *ext_str = pos; *ext_len = -1; return FAILURE; } - if (PHAR_G(manifest_cached) && zend_hash_exists(&cached_alias, (char *) filename, pos - filename)) { + if (PHAR_G(manifest_cached) && zend_hash_str_exists(&cached_alias, (char *) filename, pos - filename)) { *ext_str = pos; *ext_len = -1; return FAILURE; @@ -1926,71 +1926,70 @@ int phar_detect_phar_fname_ext(const char *filename, int filename_len, const cha } if (zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)) || PHAR_G(manifest_cached)) { - phar_archive_data **pphar; + phar_archive_data *pphar; if (is_complete) { - if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), (char *) filename, filename_len, (void **)&pphar)) { - *ext_str = filename + (filename_len - (*pphar)->ext_len); + if (NULL != (pphar = zend_hash_str_find_ptr(&(PHAR_GLOBALS->phar_fname_map), (char *) filename, filename_len))) { + *ext_str = filename + (filename_len - pphar->ext_len); woohoo: - *ext_len = (*pphar)->ext_len; + *ext_len = pphar->ext_len; if (executable == 2) { return SUCCESS; } - if (executable == 1 && !(*pphar)->is_data) { + if (executable == 1 && !pphar->is_data) { return SUCCESS; } - if (!executable && (*pphar)->is_data) { + if (!executable && pphar->is_data) { return SUCCESS; } return FAILURE; } - if (PHAR_G(manifest_cached) && SUCCESS == zend_hash_find(&cached_phars, (char *) filename, filename_len, (void **)&pphar)) { - *ext_str = filename + (filename_len - (*pphar)->ext_len); + if (PHAR_G(manifest_cached) && NULL != (pphar = zend_hash_str_find_ptr(&cached_phars, (char *) filename, filename_len))) { + *ext_str = filename + (filename_len - pphar->ext_len); goto woohoo; } } else { - char *str_key; - uint keylen; + zend_string *str_key; ulong unused; for (zend_hash_internal_pointer_reset(&(PHAR_GLOBALS->phar_fname_map)); - HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&(PHAR_GLOBALS->phar_fname_map), &str_key, &keylen, &unused, 0, NULL); + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&(PHAR_GLOBALS->phar_fname_map), &str_key, &unused, 0, &PHAR_GLOBALS->phar_fname_map.nInternalPointer); zend_hash_move_forward(&(PHAR_GLOBALS->phar_fname_map)) ) { - if (keylen > (uint) filename_len) { + if (str_key->len > (uint) filename_len) { continue; } - if (!memcmp(filename, str_key, keylen) && ((uint)filename_len == keylen - || filename[keylen] == '/' || filename[keylen] == '\0')) { - if (FAILURE == zend_hash_get_current_data(&(PHAR_GLOBALS->phar_fname_map), (void **) &pphar)) { + if (!memcmp(filename, str_key->val, str_key->len) && ((uint)filename_len == str_key->len + || filename[str_key->len] == '/' || filename[str_key->len] == '\0')) { + if (NULL == (pphar = zend_hash_get_current_data_ptr(&(PHAR_GLOBALS->phar_fname_map)))) { break; } - *ext_str = filename + (keylen - (*pphar)->ext_len); + *ext_str = filename + (str_key->len - pphar->ext_len); goto woohoo; } } if (PHAR_G(manifest_cached)) { for (zend_hash_internal_pointer_reset(&cached_phars); - HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&cached_phars, &str_key, &keylen, &unused, 0, NULL); + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&cached_phars, &str_key, &unused, 0, &cached_phars.nInternalPointer); zend_hash_move_forward(&cached_phars) ) { - if (keylen > (uint) filename_len) { + if (str_key->len > (uint) filename_len) { continue; } - if (!memcmp(filename, str_key, keylen) && ((uint)filename_len == keylen - || filename[keylen] == '/' || filename[keylen] == '\0')) { - if (FAILURE == zend_hash_get_current_data(&cached_phars, (void **) &pphar)) { + if (!memcmp(filename, str_key->val, str_key->len) && ((uint)filename_len == str_key->len + || filename[str_key->len] == '/' || filename[str_key->len] == '\0')) { + if (NULL == (pphar = zend_hash_get_current_data_ptr(&cached_phars))) { break; } - *ext_str = filename + (keylen - (*pphar)->ext_len); + *ext_str = filename + (str_key->len - pphar->ext_len); goto woohoo; } } @@ -2253,7 +2252,7 @@ int phar_split_fname(const char *filename, int filename_len, char **arch, int *a #ifdef PHP_WIN32 *arch = save; #else - *arch = filename; + *arch = (char*)filename; #endif } @@ -2297,7 +2296,7 @@ int phar_split_fname(const char *filename, int filename_len, char **arch, int *a int phar_open_executed_filename(char *alias, int alias_len, char **error TSRMLS_DC) /* {{{ */ { char *fname; - zval *halt_constant; +//??? zval *halt_constant; php_stream *fp; int fname_len; char *actual = NULL; @@ -2321,17 +2320,13 @@ int phar_open_executed_filename(char *alias, int alias_len, char **error TSRMLS_ return FAILURE; } - MAKE_STD_ZVAL(halt_constant); - - if (0 == zend_get_constant("__COMPILER_HALT_OFFSET__", 24, halt_constant TSRMLS_CC)) { - FREE_ZVAL(halt_constant); + if (0 == zend_get_constant_str("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__")-1 TSRMLS_CC)) { if (error) { spprintf(error, 0, "__HALT_COMPILER(); must be declared in a phar"); } return FAILURE; } - FREE_ZVAL(halt_constant); #if PHP_API_VERSION < 20100412 if (PG(safe_mode) && (!php_checkuid(fname, NULL, CHECKUID_ALLOW_ONLY_FILE))) { @@ -2469,9 +2464,9 @@ static inline void phar_set_32(char *buffer, int var) /* {{{ */ #endif } /* }}} */ -static int phar_flush_clean_deleted_apply(void *data TSRMLS_DC) /* {{{ */ +static int phar_flush_clean_deleted_apply(zval *zv TSRMLS_DC) /* {{{ */ { - phar_entry_info *entry = (phar_entry_info *)data; + phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv); if (entry->fp_refcount <= 0 && entry->is_deleted) { return ZEND_HASH_APPLY_REMOVE; @@ -2607,7 +2602,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, zend_string *suser_stub; if (len < 0) { /* resource passed in */ - if (!(php_stream_from_zval_no_verify(stubfile, (zval **)user_stub))) { + if (!(php_stream_from_zval_no_verify(stubfile, (zval *)user_stub))) { if (closeoldfile) { php_stream_close(oldfile); } @@ -2717,20 +2712,18 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, zend_hash_apply(&phar->manifest, phar_flush_clean_deleted_apply TSRMLS_CC); /* compress as necessary, calculate crcs, serialize meta-data, manifest size, and file sizes */ - main_metadata_str.c = 0; - if (phar->metadata) { + main_metadata_str.s = NULL; + if (Z_TYPE(phar->metadata) != IS_UNDEF) { PHP_VAR_SERIALIZE_INIT(metadata_hash); php_var_serialize(&main_metadata_str, &phar->metadata, &metadata_hash TSRMLS_CC); PHP_VAR_SERIALIZE_DESTROY(metadata_hash); - } else { - main_metadata_str.len = 0; } new_manifest_count = 0; offset = 0; for (zend_hash_internal_pointer_reset(&phar->manifest); zend_hash_has_more_elements(&phar->manifest) == SUCCESS; zend_hash_move_forward(&phar->manifest)) { - if (zend_hash_get_current_data(&phar->manifest, (void **)&entry) == FAILURE) { + if ((entry = zend_hash_get_current_data_ptr(&phar->manifest)) == NULL) { continue; } if (entry->cfp) { @@ -2762,25 +2755,23 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, /* we use this to calculate API version, 1.1.1 is used for phars with directories */ has_dirs = 1; } - if (entry->metadata) { - if (entry->metadata_str.c) { + if (Z_TYPE(entry->metadata) != IS_UNDEF) { + if (entry->metadata_str.s) { smart_str_free(&entry->metadata_str); } - entry->metadata_str.c = 0; - entry->metadata_str.len = 0; + entry->metadata_str.s = NULL; PHP_VAR_SERIALIZE_INIT(metadata_hash); php_var_serialize(&entry->metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC); PHP_VAR_SERIALIZE_DESTROY(metadata_hash); } else { - if (entry->metadata_str.c) { + if (entry->metadata_str.s) { smart_str_free(&entry->metadata_str); } - entry->metadata_str.c = 0; - entry->metadata_str.len = 0; + entry->metadata_str.s = NULL; } /* 32 bits for filename length, length of filename, manifest + metadata, and add 1 for trailing / if a directory */ - offset += 4 + entry->filename_len + sizeof(entry_buffer) + entry->metadata_str.len + (entry->is_dir ? 1 : 0); + offset += 4 + entry->filename_len + sizeof(entry_buffer) + (entry->metadata_str.s ? entry->metadata_str.s->len : 0) + (entry->is_dir ? 1 : 0); /* compress and rehash as necessary */ if ((oldfile && !entry->is_modified) || entry->is_dir) { @@ -2906,7 +2897,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, phar->alias_len = 0; } - manifest_len = offset + phar->alias_len + sizeof(manifest) + main_metadata_str.len; + manifest_len = offset + phar->alias_len + sizeof(manifest) + (main_metadata_str.s ? main_metadata_str.s->len : 0); phar_set_32(manifest, manifest_len); /* Hack - see bug #65028, add padding byte to the end of the manifest */ if(manifest[0] == '\r' || manifest[0] == '\n') { @@ -2945,9 +2936,9 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, phar->alias_len = restore_alias_len; - phar_set_32(manifest, main_metadata_str.len); - if (4 != php_stream_write(newfile, manifest, 4) || (main_metadata_str.len - && main_metadata_str.len != php_stream_write(newfile, main_metadata_str.c, main_metadata_str.len))) { + phar_set_32(manifest, main_metadata_str.s ? main_metadata_str.s->len : 0); + if (4 != php_stream_write(newfile, manifest, 4) || ((main_metadata_str.s ? main_metadata_str.s->len : 0) + && main_metadata_str.s->len != php_stream_write(newfile, main_metadata_str.s->val, main_metadata_str.s->len))) { smart_str_free(&main_metadata_str); if (closeoldfile) { @@ -2973,7 +2964,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, zend_hash_has_more_elements(&phar->manifest) == SUCCESS; zend_hash_move_forward(&phar->manifest)) { - if (zend_hash_get_current_data(&phar->manifest, (void **)&entry) == FAILURE) { + if ((entry = zend_hash_get_current_data_ptr(&phar->manifest)) == NULL) { continue; } @@ -3021,10 +3012,10 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, phar_set_32(entry_buffer+8, entry->compressed_filesize); phar_set_32(entry_buffer+12, entry->crc32); phar_set_32(entry_buffer+16, entry->flags); - phar_set_32(entry_buffer+20, entry->metadata_str.len); + phar_set_32(entry_buffer+20, entry->metadata_str.s ? entry->metadata_str.s->len : 0); if (sizeof(entry_buffer) != php_stream_write(newfile, entry_buffer, sizeof(entry_buffer)) - || entry->metadata_str.len != php_stream_write(newfile, entry->metadata_str.c, entry->metadata_str.len)) { + || entry->metadata_str.s->len != php_stream_write(newfile, entry->metadata_str.s->val, entry->metadata_str.s->len)) { if (closeoldfile) { php_stream_close(oldfile); } @@ -3061,7 +3052,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, zend_hash_has_more_elements(&phar->manifest) == SUCCESS; zend_hash_move_forward(&phar->manifest)) { - if (zend_hash_get_current_data(&phar->manifest, (void **)&entry) == FAILURE) { + if ((entry = zend_hash_get_current_data_ptr(&phar->manifest)) == NULL) { continue; } @@ -3380,6 +3371,11 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type typedef zend_op_array* (zend_compile_t)(zend_file_handle*, int TSRMLS_DC); typedef zend_compile_t* (compile_hook)(zend_compile_t *ptr); +static void mime_type_dtor(zval *zv) +{ + free(Z_PTR_P(zv)); +} + PHP_GINIT_FUNCTION(phar) /* {{{ */ { phar_mime_type mime; @@ -3387,13 +3383,13 @@ PHP_GINIT_FUNCTION(phar) /* {{{ */ memset(phar_globals, 0, sizeof(zend_phar_globals)); phar_globals->readonly = 1; - zend_hash_init(&phar_globals->mime_types, 0, NULL, NULL, 1); + zend_hash_init(&phar_globals->mime_types, 0, NULL, mime_type_dtor, 1); #define PHAR_SET_MIME(mimetype, ret, fileext) \ mime.mime = mimetype; \ mime.len = sizeof((mimetype))+1; \ mime.type = ret; \ - zend_hash_add(&phar_globals->mime_types, fileext, sizeof(fileext)-1, (void *)&mime, sizeof(phar_mime_type), NULL); \ + zend_hash_str_add_mem(&phar_globals->mime_types, fileext, sizeof(fileext)-1, (void *)&mime, sizeof(phar_mime_type)); \ PHAR_SET_MIME("text/html", PHAR_MIME_PHPS, "phps") PHAR_SET_MIME("text/plain", PHAR_MIME_OTHER, "c") @@ -3490,8 +3486,8 @@ void phar_request_initialize(TSRMLS_D) /* {{{ */ { PHAR_G(last_phar) = NULL; PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; - PHAR_G(has_bz2) = zend_hash_exists(&module_registry, "bz2", sizeof("bz2")); - PHAR_G(has_zlib) = zend_hash_exists(&module_registry, "zlib", sizeof("zlib")); + PHAR_G(has_bz2) = zend_hash_str_exists(&module_registry, "bz2", sizeof("bz2")-1); + PHAR_G(has_zlib) = zend_hash_str_exists(&module_registry, "zlib", sizeof("zlib")-1); PHAR_GLOBALS->request_init = 1; PHAR_GLOBALS->request_ends = 0; PHAR_GLOBALS->request_done = 0; @@ -3500,13 +3496,13 @@ void phar_request_initialize(TSRMLS_D) /* {{{ */ zend_hash_init(&(PHAR_GLOBALS->phar_alias_map), 5, zend_get_hash_value, NULL, 0); if (PHAR_G(manifest_cached)) { - phar_archive_data **pphar; + phar_archive_data *pphar; phar_entry_fp *stuff = (phar_entry_fp *) ecalloc(zend_hash_num_elements(&cached_phars), sizeof(phar_entry_fp)); for (zend_hash_internal_pointer_reset(&cached_phars); - zend_hash_get_current_data(&cached_phars, (void **)&pphar) == SUCCESS; + (pphar = zend_hash_get_current_data_ptr(&cached_phars)) != NULL; zend_hash_move_forward(&cached_phars)) { - stuff[pphar[0]->phar_pos].manifest = (phar_entry_fp_info *) ecalloc( zend_hash_num_elements(&(pphar[0]->manifest)), sizeof(phar_entry_fp_info)); + stuff[pphar->phar_pos].manifest = (phar_entry_fp_info *) ecalloc( zend_hash_num_elements(&(pphar->manifest)), sizeof(phar_entry_fp_info)); } PHAR_GLOBALS->cached_fp = stuff; @@ -3593,7 +3589,7 @@ PHP_MINFO_FUNCTION(phar) /* {{{ */ #ifdef PHAR_HAVE_OPENSSL php_info_print_table_row(2, "Native OpenSSL support", "enabled"); #else - if (zend_hash_exists(&module_registry, "openssl", sizeof("openssl"))) { + if (zend_hash_str_exists(&module_registry, "openssl", sizeof("openssl")-1)) { php_info_print_table_row(2, "OpenSSL support", "enabled"); } else { php_info_print_table_row(2, "OpenSSL support", "disabled (install ext/openssl)"); |
