* When all uses of a phar have been concluded, this frees the manifest
* and the phar slot
*/
-static void phar_destroy_phar_data(phar_archive_data *phar TSRMLS_DC) /* {{{ */
+void phar_destroy_phar_data(phar_archive_data *phar TSRMLS_DC) /* {{{ */
{
if (phar->alias && phar->alias != phar->fname) {
efree(phar->alias);
void phar_request_initialize(TSRMLS_D);
void phar_object_init(TSRMLS_D);
+void phar_destroy_phar_data(phar_archive_data *phar TSRMLS_DC);
int phar_open_entry_file(phar_archive_data *phar, phar_entry_info *entry, char **error TSRMLS_DC);
int phar_open_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC);
if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), newpath, phar->fname_len, (void **) &pphar)) {
if ((*pphar)->fname_len == phar->fname_len && !memcmp((*pphar)->fname, phar->fname, phar->fname_len)) {
if (!zend_hash_num_elements(&phar->manifest)) {
+ (*pphar)->is_tar = phar->is_tar;
+ (*pphar)->is_zip = phar->is_zip;
+ (*pphar)->is_data = phar->is_data;
+ (*pphar)->flags = phar->flags;
+ (*pphar)->fp = phar->fp;
+ phar->fp = NULL;
+ phar_destroy_phar_data(phar);
+ phar = *pphar;
+ newpath = oldpath;
goto its_ok;
}
}
entry.is_tar = 1;
entry.is_crc_checked = 1;
entry.phar = myphar;
+ pos += sizeof(buf);
do {
phar_entry_info *newentry;
- pos += sizeof(buf);
+ pos = php_stream_tell(fp);
hdr = (tar_header*) buf;
sum1 = phar_tar_number(hdr->checksum, sizeof(hdr->checksum));
if (sum1 == 0 && phar_tar_checksum(buf, sizeof(buf)) == 0) {
}
}
size = (size+511)&~511;
- pos += size;
if (((hdr->typeflag == 0) || (hdr->typeflag == TAR_FILE)) && size > 0) {
/* this is not good enough - seek succeeds even on truncated tars */
php_stream_seek(fp, size, SEEK_CUR);