]> granicus.if.org Git - php/commitdiff
MFB: fix Bug #48257: PharData throws exception with non-phar tar
authorGreg Beaver <cellog@php.net>
Wed, 13 May 2009 20:26:18 +0000 (20:26 +0000)
committerGreg Beaver <cellog@php.net>
Wed, 13 May 2009 20:26:18 +0000 (20:26 +0000)
ext/phar/phar.c
ext/phar/phar_internal.h
ext/phar/tar.c
ext/phar/tests/tar/files/Net_URL-1.0.15.tgz [new file with mode: 0644]
ext/phar/tests/tar/require_hash.phpt

index 0566f48a5a48e7dfa01838f1b43125f7efbf8f43..e24f8878562bceac978aedc23792ca5d547dcc65 100644 (file)
@@ -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);
index cbb6cf2db17905ef218ad0d0f8554b5cd1bee97a..12596706909cabb0c0d79a7e4c692f146925b29c 100755 (executable)
@@ -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;
index 8101cdf21f871f1c0580f4bf56d44c39bc45d1e9..0ff00471bddf93381eec14599bb5c0b0c65c1f3a 100644 (file)
@@ -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 (file)
index 0000000..976603d
Binary files /dev/null and b/ext/phar/tests/tar/files/Net_URL-1.0.15.tgz differ
index 002931bba6ddad64d5e50f13cc130876d3e6721b..638534be1c8ebd48e057505daab5c5200e79901c 100644 (file)
@@ -18,6 +18,7 @@ $tar = new tarmaker($fname, 'none');
 $tar->init();
 $tar->addFile('tar_004.php', '<?php var_dump(__FILE__);');
 $tar->addFile('internal/file/here', "hi there!\n");
+$tar->addFile('.phar/stub.php', "__HALT_COMPILER();");
 $tar->close();
 
 try {