From 5af0cbef65f48f8b7de8223a0f48be0e9e93a845 Mon Sep 17 00:00:00 2001 From: Greg Beaver Date: Wed, 13 May 2009 20:26:18 +0000 Subject: [PATCH] MFB: fix Bug #48257: PharData throws exception with non-phar tar --- ext/phar/phar.c | 10 +++++----- ext/phar/phar_internal.h | 4 ++-- ext/phar/tar.c | 16 ++++++++-------- ext/phar/tests/tar/files/Net_URL-1.0.15.tgz | Bin 0 -> 6303 bytes ext/phar/tests/tar/require_hash.phpt | 1 + 5 files changed, 16 insertions(+), 15 deletions(-) create mode 100644 ext/phar/tests/tar/files/Net_URL-1.0.15.tgz diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 0566f48a5a..e24f887856 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1345,7 +1345,7 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a } if (fp) { - if (phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC) == SUCCESS) { + if (phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, is_data, error TSRMLS_CC) == SUCCESS) { if ((*pphar)->is_data || !PHAR_G(readonly)) { (*pphar)->is_writeable = 1; } @@ -1519,7 +1519,7 @@ int phar_open_from_filename(char *fname, int fname_len, char *alias, int alias_l fname_len = strlen(actual); } - ret = phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC); + ret = phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, is_data, error TSRMLS_CC); if (actual) { efree(actual); @@ -1563,7 +1563,7 @@ static inline char *phar_strnstr(const char *buf, int buf_len, const char *searc * that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS * or FAILURE is returned and pphar is set to a pointer to the phar's manifest */ -static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */ +static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, int is_data, char **error TSRMLS_DC) /* {{{ */ { const char token[] = "__HALT_COMPILER();"; const char zip_magic[] = "PK\x03\x04"; @@ -1706,7 +1706,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a if (got > 512) { if (phar_is_tar(pos, fname)) { php_stream_rewind(fp); - return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, compression, error TSRMLS_CC); + return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, is_data, compression, error TSRMLS_CC); } } } @@ -2380,7 +2380,7 @@ int phar_open_executed_filename(char *alias, int alias_len, char **error TSRMLS_ fname_len = strlen(actual); } - ret = phar_open_from_fp(fp, fname, fname_len, alias, alias_len, REPORT_ERRORS, NULL, error TSRMLS_CC); + ret = phar_open_from_fp(fp, fname, fname_len, alias, alias_len, REPORT_ERRORS, NULL, 0, error TSRMLS_CC); if (actual) { efree(actual); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index cbb6cf2db1..1259670690 100755 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -633,7 +633,7 @@ int phar_copy_on_write(phar_archive_data **pphar TSRMLS_DC); /* tar functions in tar.c */ int phar_is_tar(char *buf, char *fname); -int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, phar_archive_data** pphar, php_uint32 compression, char **error TSRMLS_DC); +int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, phar_archive_data** pphar, int is_data, php_uint32 compression, char **error TSRMLS_DC); int phar_open_or_create_tar(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC); int phar_tar_flush(phar_archive_data *phar, char *user_stub, long len, int defaultstub, char **error TSRMLS_DC); @@ -643,7 +643,7 @@ int phar_open_or_create_zip(char *fname, int fname_len, char *alias, int alias_l int phar_zip_flush(phar_archive_data *archive, char *user_stub, long len, int defaultstub, char **error TSRMLS_DC); #ifdef PHAR_MAIN -static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC); +static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, int is_data, char **error TSRMLS_DC); extern php_stream_wrapper php_stream_phar_wrapper; #else extern HashTable cached_phars; diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 8101cdf21f..0ff00471bd 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -192,7 +192,7 @@ static int phar_tar_process_metadata(phar_entry_info *entry, php_stream *fp TSRM } /* }}} */ -int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, phar_archive_data** pphar, php_uint32 compression, char **error TSRMLS_DC) /* {{{ */ +int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, int alias_len, phar_archive_data** pphar, int is_data, php_uint32 compression, char **error TSRMLS_DC) /* {{{ */ { char buf[512], *actual_alias = NULL, *p; phar_entry_info entry = {0}; @@ -496,8 +496,14 @@ bail: } } while (read != 0); + if (zend_hash_exists(&(myphar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1)) { + myphar->is_data = 0; + } else { + myphar->is_data = 1; + } + /* ensure signature set */ - if (PHAR_G(require_hash) && !myphar->signature) { + if (!myphar->is_data && PHAR_G(require_hash) && !myphar->signature) { php_stream_close(fp); phar_destroy_phar_data(myphar TSRMLS_CC); if (error) { @@ -514,12 +520,6 @@ bail: myphar->fp = fp; p = strrchr(myphar->fname, '/'); - if (zend_hash_exists(&(myphar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1)) { - myphar->is_data = 0; - } else { - myphar->is_data = 1; - } - if (p) { myphar->ext = memchr(p, '.', (myphar->fname + fname_len) - p); if (myphar->ext == p) { diff --git a/ext/phar/tests/tar/files/Net_URL-1.0.15.tgz b/ext/phar/tests/tar/files/Net_URL-1.0.15.tgz new file mode 100644 index 0000000000000000000000000000000000000000..976603da3d2db1ed126c25ff06f032a6aa43e83c GIT binary patch literal 6303 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 V<@0|4009600{~Mbu~z_i008pBQg{FW literal 0 HcmV?d00001 diff --git a/ext/phar/tests/tar/require_hash.phpt b/ext/phar/tests/tar/require_hash.phpt index 002931bba6..638534be1c 100644 --- a/ext/phar/tests/tar/require_hash.phpt +++ b/ext/phar/tests/tar/require_hash.phpt @@ -18,6 +18,7 @@ $tar = new tarmaker($fname, 'none'); $tar->init(); $tar->addFile('tar_004.php', 'addFile('internal/file/here', "hi there!\n"); +$tar->addFile('.phar/stub.php', "__HALT_COMPILER();"); $tar->close(); try { -- 2.50.1