From 1f661c81c4243c2ca675606ad74c5ec2e0d0872d Mon Sep 17 00:00:00 2001 From: Greg Beaver Date: Wed, 21 May 2008 22:00:43 +0000 Subject: [PATCH] fix offset detection in tar files --- ext/phar/phar.c | 2 +- ext/phar/phar_internal.h | 1 + ext/phar/phar_object.c | 9 +++++++++ ext/phar/tar.c | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 54ee0cad34..f432c06926 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -101,7 +101,7 @@ PHP_INI_END() * 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); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 185b1e2ffe..b467fbe2d8 100755 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -395,6 +395,7 @@ static inline int phar_validate_alias(const char *alias, int alias_len) /* {{{ * 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); diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index cc0156fb1c..e145a289a7 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1893,6 +1893,15 @@ static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool c 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; } } diff --git a/ext/phar/tar.c b/ext/phar/tar.c index bcde5dc0a0..802f6149db 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -225,10 +225,11 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i 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) { @@ -385,7 +386,6 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i } } 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); -- 2.40.0