From: Steph Fox Date: Mon, 3 Mar 2008 08:41:15 +0000 (+0000) Subject: - A bit more work on PharData creation/conversion. X-Git-Tag: RELEASE_2_0_0a1~270 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8343d7c1395608c6e4941e10e9aa27e8fe9a7854;p=php - A bit more work on PharData creation/conversion. - If readonly=0, why not $phardata->convertToPhar()? - Known issue with directories creating 'as-file' copies within the archive (all formats) @Greg/Marcus/Tony: This passes all tests on my box, 5.2/5.3/release_ts/debug_ts, and I can't find any more memleaks. Obviously this is too good to be true, so if conversion is still messy elsewhere please feel free to fix, or bug and assign to me. --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 2228530724..b02a693106 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -405,22 +405,34 @@ int phar_open_loaded(char *fname, int fname_len, char *alias, int alias_len, int && ((alias && fname_len == phar->fname_len && !strncmp(unixfname, phar->fname, fname_len)) || !alias) ) { + phar_entry_info *stub; efree(unixfname); #else if (SUCCESS == phar_get_archive(&phar, fname, fname_len, alias, alias_len, error TSRMLS_CC) && ((alias && fname_len == phar->fname_len && !strncmp(fname, phar->fname, fname_len)) || !alias) ) { + phar_entry_info *stub; #endif /* logic above is as follows: If an explicit alias was requested, ensure the filename passed in matches the phar's filename. If no alias was passed in, then it can match either and be valid */ + + if (!is_data) { + /* prevent any ".phar" without a stub getting through */ + if (!phar->halt_offset && !phar->is_brandnew) { + if (FAILURE == zend_hash_find(&(phar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1, (void **)&stub)) { + spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname); + return FAILURE; + } + } + } + phar->is_data = is_data; if (pphar) { *pphar = phar; } - phar->is_data = is_data; return SUCCESS; } else { #ifdef PHP_WIN32 @@ -978,27 +990,30 @@ int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int al if (ext_len >= sizeof(".zip")-1 && !memcmp((void *) ext_str, (void *) ".zip", sizeof(".zip")-1)) { zip = 1; } - - if (ext_len >= sizeof(".tar")-1 && !memcmp((void *) ext_str, (void *) ".tar", sizeof(".tar")-1)) { + + if ((ext_len >= sizeof(".tar")-1 && !memcmp((void *) ext_str, (void *) ".tar", sizeof(".tar")-1)) || (ext_len >= sizeof(".tgz")-1 && !memcmp((void *) ext_str, (void *) ".tgz", sizeof(".tgz")-1))) { tar = 1; } if (tar || zip) { if (objname && strncmp(objname, "PharData", 8) != 0) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open '%s' as a Phar object. Use PharData::__construct() for a standard zip or tar archive", fname); + /* Nested exception causes memleak here */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open '%s' as a Phar object. Use PharData::__construct() for a standard %s archive", fname, tar ? "tar" : "zip"); return FAILURE; } is_data = 1; } else { if (objname && strncmp(objname, "PharData", 8) == 0) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open '%s' as a PharData object. Use Phar::__construct() for archives other than .zip and .tar", fname); + /* Nested exception causes memleak here */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open '%s' as a PharData object. Use Phar::__construct() for archives named other than .zip or .tar", fname); return FAILURE; } } } else { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot open '%s' as a %s object, file extension (or combination) not recognised", fname, objname); + /* Nested exception causes memleak here */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open '%s' as a %s object, file extension (or combination) not recognised", fname, objname); return FAILURE; } @@ -1019,11 +1034,11 @@ int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int al return phar_open_or_create_tar(fname, fname_len, alias, alias_len, is_data, options, pphar, error TSRMLS_CC); } - return phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC); + return phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, pphar, error TSRMLS_CC); } -int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */ +int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */ { phar_archive_data *mydata; int register_alias; @@ -1052,7 +1067,7 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a if (fp) { if (phar_open_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC) == SUCCESS) { - if (!PHAR_G(readonly)) { + if (is_data || !PHAR_G(readonly)) { (*pphar)->is_writeable = 1; } if (actual) { @@ -1071,8 +1086,7 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a efree(actual); } - - if (PHAR_G(readonly)) { + if (PHAR_G(readonly) && !is_data) { if (options & REPORT_ERRORS) { if (error) { spprintf(error, 0, "creating archive \"%s\" disabled by INI setting", fname); @@ -1098,8 +1112,13 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a zend_hash_init(&mydata->mounted_dirs, sizeof(char *), zend_get_hash_value, NULL, 0); mydata->fname_len = fname_len; - mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len); - mydata->alias_len = alias ? alias_len : fname_len; + if (is_data) { + alias = NULL; + alias_len = 0; + } else { + mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len); + mydata->alias_len = alias ? alias_len : fname_len; + } snprintf(mydata->version, sizeof(mydata->version), "%s", PHAR_API_VERSION_STR); mydata->is_temporary_alias = alias ? 0 : 1; mydata->internal_file_start = -1; @@ -1134,13 +1153,17 @@ int phar_open_filename(char *fname, int fname_len, char *alias, int alias_len, i { php_stream *fp; char *actual; - int ret; + int ret, is_data = 0; if (error) { *error = NULL; } - - if (phar_open_loaded(fname, fname_len, alias, alias_len, 0, options, pphar, error TSRMLS_CC) == SUCCESS) { + + if (!strstr(fname, ".phar")) { + is_data = 1; + } + + if (phar_open_loaded(fname, fname_len, alias, alias_len, is_data, options, pphar, error TSRMLS_CC) == SUCCESS) { return SUCCESS; } else if (error && *error) { return FAILURE; @@ -1335,6 +1358,7 @@ int phar_detect_phar_fname_ext(const char *filename, int check_length, char **ex { char end; char *pos_t = strstr(filename, ".tar"); + char *pos_tgz = strstr(filename, ".tgz"); char *pos_z = strstr(filename, ".zip"); char *pos_tg = strstr(filename, ".tar.gz"); char *pos_tb = strstr(filename, ".tar.bz2"); @@ -1384,6 +1408,9 @@ int phar_detect_phar_fname_ext(const char *filename, int check_length, char **ex } else if (pos_z) { *ext_str = pos_z; *ext_len = 4; + } else if (pos_tgz) { + *ext_str = pos_tgz; + *ext_len = 4; } else if (pos_t) { *ext_str = pos_t; *ext_len = 4; @@ -1615,7 +1642,7 @@ int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC) long halt_offset; zval *halt_constant; php_stream *fp; - int fname_len; + int fname_len, is_data = 0; if (error) { *error = NULL; @@ -1623,7 +1650,11 @@ int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC) fname = zend_get_executed_filename(TSRMLS_C); fname_len = strlen(fname); - if (phar_open_loaded(fname, fname_len, alias, alias_len, 0, REPORT_ERRORS, NULL, 0 TSRMLS_CC) == SUCCESS) { + if (!strstr(fname, ".phar")) { + is_data = 1; + } + + if (phar_open_loaded(fname, fname_len, alias, alias_len, is_data, REPORT_ERRORS, NULL, 0 TSRMLS_CC) == SUCCESS) { return SUCCESS; } diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 7cc44b4fc8..54203114ac 100755 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -366,7 +366,7 @@ void phar_object_init(TSRMLS_D); 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); int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, char *objname, int options, phar_archive_data** pphar, char **error TSRMLS_DC); -int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC); +int phar_create_or_parse_filename(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_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC); int phar_get_archive(phar_archive_data **archive, char *fname, int fname_len, char *alias, int alias_len, char **error TSRMLS_DC); int phar_open_loaded(char *fname, int fname_len, char *alias, int alias_len, int is_data, 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 d50cd92ec2..bc1aada584 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1108,7 +1108,7 @@ PHP_METHOD(Phar, __construct) #if !HAVE_SPL zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Cannot instantiate Phar object without SPL extension"); #else - char *fname, *alias = NULL, *error, *arch, *entry = NULL, *save_fname; + char *fname, *alias = NULL, *error, *arch, *entry = NULL, *save_fname, *objname; int fname_len, alias_len = 0, arch_len, entry_len, is_data; long flags = 0; phar_archive_object *phar_obj; @@ -1144,21 +1144,21 @@ PHP_METHOD(Phar, __construct) #endif } - if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, phar_obj->std.ce->name, REPORT_ERRORS, &phar_data, &error TSRMLS_CC) == FAILURE) { + objname = phar_obj->std.ce->name; + + if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, objname, REPORT_ERRORS, &phar_data, &error TSRMLS_CC) == FAILURE) { if (fname == arch) { efree(arch); fname = save_fname; } - if (error) { + if (entry) { efree(entry); + } + if (error) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, - "Cannot open phar file '%s' with alias '%s': %s", fname, alias, error); + "%s", error); efree(error); - } else { - efree(entry); - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, - "Cannot open phar file '%s' with alias '%s'", fname, alias); } return; } @@ -1864,12 +1864,6 @@ PHP_METHOD(Phar, convertToPhar) int ext_len = 0; PHAR_ARCHIVE_OBJECT(); - if (phar_obj->arc.archive->is_data) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, - "A plain %s archive cannot be converted to a Phar archive", phar_obj->arc.archive->is_tar ? "tar" : "zip"); - return; - } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &method, &ext, &ext_len) == FAILURE) { return; } @@ -1878,6 +1872,12 @@ PHP_METHOD(Phar, convertToPhar) RETURN_TRUE; } + if (PHAR_G(readonly)) { /* Don't override this one for is_data */ + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, + "Cannot write out phar archive, phar is read-only"); + return; + } + switch (method) { case 0: flags = PHAR_FILE_COMPRESSED_NONE; @@ -1904,11 +1904,6 @@ PHP_METHOD(Phar, convertToPhar) "Unknown compression specified, please pass one of Phar::GZ or Phar::BZ2"); return; } - if (PHAR_G(readonly)) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, - "Cannot write out phar archive, phar is read-only"); - return; - } if (phar_obj->arc.archive->donotflush) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, diff --git a/ext/phar/tar.c b/ext/phar/tar.c index f7f8dba3cd..a30998f96b 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -119,7 +119,7 @@ int phar_is_tar(char *buf) 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) /* {{{ */ { phar_archive_data *phar; - int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, &phar, error TSRMLS_CC); + int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, &phar, error TSRMLS_CC); if (FAILURE == ret) { return FAILURE; @@ -131,12 +131,6 @@ int phar_open_or_create_tar(char *fname, int fname_len, char *alias, int alias_l phar->is_data = is_data; - if (is_data) { - /* phar->is_writeable; WTF */ - phar->alias = NULL; - phar->alias_len = 0; - } - if (phar->is_tar) { return ret; } diff --git a/ext/phar/tests/012.phpt b/ext/phar/tests/012.phpt index f6f81f5142..3246eff468 100644 --- a/ext/phar/tests/012.phpt +++ b/ext/phar/tests/012.phpt @@ -6,6 +6,7 @@ Phar::mapPhar valid file phar.require_hash=0 --FILE-- --CLEAN-- --EXPECT-- -a \ No newline at end of file +a diff --git a/ext/phar/tests/phar_convert_repeated.phpt b/ext/phar/tests/phar_convert_repeated.phpt new file mode 100644 index 0000000000..300a91ac7e --- /dev/null +++ b/ext/phar/tests/phar_convert_repeated.phpt @@ -0,0 +1,141 @@ +--TEST-- +Phar::convertToZip|Tar|Phar() repeated (phar_based archives) +--SKIPIF-- + +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +'; +$file = $stub; + +$files = array(); +$files['a'] = 'a'; +$files['b'] = 'b'; +$files['c'] = 'c'; + +include 'files/phar_test.inc'; + +echo "=================== new Phar() =======================\n"; +$phar = new Phar($fname); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToTar() =====================\n"; + +$phar->convertToTar(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToZip() =====================\n"; + +$phar->convertToZip(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToPhar() ====================\n"; + +$phar->convertToPhar(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump(strlen($phar->getStub())); +var_dump($phar->getAlias()); + +echo "================= convertToZip() =====================\n"; + +$phar->convertToZip(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToTar() =====================\n"; + +$phar->convertToTar(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToZip() =====================\n"; + +$phar->convertToZip(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +?> +===DONE=== +--CLEAN-- + +--EXPECT-- +=================== new Phar() ======================= +bool(true) +bool(false) +bool(false) +string(48) "" +string(3) "hio" +================= convertToTar() ===================== +bool(false) +bool(true) +bool(false) +string(60) " +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToTar() =====================\n"; + +$phar->convertToTar(Phar::GZ); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToZip() =====================\n"; + +$phar->convertToZip(); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToPhar() ====================\n"; + +try { + $phar->convertToPhar(); + var_dump($phar->isPhar()); + var_dump($phar->isTar()); + var_dump($phar->isZip()); + var_dump(strlen($phar->getStub())); + var_dump($phar->getAlias()); +} catch(Exception $e) { + echo $e->getMessage()."\n"; +} + +echo "================ convertToTar(GZ) ====================\n"; + +$phar->convertToTar(Phar::GZ); +var_dump($phar->isPhar()); +var_dump($phar->isTar()); +var_dump($phar->isZip()); +var_dump($phar->getStub()); +var_dump($phar->getAlias()); + +echo "================= convertToPhar() ====================\n"; + +try { + $phar->convertToPhar(); + var_dump($phar->isPhar()); + var_dump($phar->isTar()); + var_dump($phar->isZip()); + var_dump(strlen($phar->getStub())); + var_dump($phar->getAlias()); +} catch(Exception $e) { + echo $e->getMessage()."\n"; +} + +?> +===DONE=== +--CLEAN-- + +--EXPECT-- +=================== new PharData() ================== +bool(false) +bool(false) +bool(true) +string(0) "" +NULL +================= convertToTar() ===================== +bool(false) +bool(true) +bool(false) +string(0) "" +NULL +================= convertToZip() ===================== +bool(false) +bool(false) +bool(true) +string(0) "" +NULL +================= convertToPhar() ==================== +bool(true) +bool(false) +bool(false) +int(6573) +NULL +================ convertToTar(GZ) ==================== +bool(false) +bool(true) +bool(false) +string(0) "" +NULL +================= convertToPhar() ==================== +bool(true) +bool(false) +bool(false) +int(6573) +NULL +===DONE=== diff --git a/ext/phar/tests/phar_convert_tar2.phpt b/ext/phar/tests/phar_convert_tar2.phpt index 6a8313848a..16d3a068e2 100644 --- a/ext/phar/tests/phar_convert_tar2.phpt +++ b/ext/phar/tests/phar_convert_tar2.phpt @@ -11,8 +11,8 @@ phar.readonly=0 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php'; $pname = 'phar://' . $fname; -$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar'; -$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.2.phar.tar'; +$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar.gz'; +$fname3 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar'; $stub = ''; $file = $stub; @@ -33,7 +33,7 @@ var_dump($phar->isTar()); var_dump($phar->isCompressed()); var_dump($phar->getStub()); -copy($fname2 . '.gz', $fname3); +copy($fname2, $fname3); $phar = new Phar($fname3); var_dump($phar->isTar()); @@ -45,8 +45,7 @@ var_dump($phar->getStub()); --CLEAN-- --EXPECT-- bool(false) diff --git a/ext/phar/tests/tar/tar_001.phpt b/ext/phar/tests/tar/tar_001.phpt index 801c0d4868..5f81c96c38 100644 --- a/ext/phar/tests/tar/tar_001.phpt +++ b/ext/phar/tests/tar/tar_001.phpt @@ -26,6 +26,6 @@ try { @unlink(dirname(__FILE__) . '/tar_001.phar.tar'); ?> --EXPECTF-- -Warning: fopen(phar://%star_001.phar.tar/tar_001.phpt): failed to open stream: phar error: "%star_001.phar.tar" is a corrupted tar file in %star_001.php on line %d -Cannot open phar file '%star_001.phar.tar' with alias '(null)': phar error: "%star_001.phar.tar" is a corrupted tar file -===DONE=== \ No newline at end of file +Warning: fopen(phar://C:\sandbox\pecl\phar\tests\tar/tar_001.phar.tar/tar_001.phpt): failed to open stream: phar error: "C:\sandbox\pecl\phar\tests\tar\tar_001.phar.tar" is a corrupted tar file in C:\sandbox\pecl\phar\tests\tar\tar_001.php on line 9 +phar error: "C:\sandbox\pecl\phar\tests\tar\tar_001.phar.tar" is a corrupted tar file +===DONE=== diff --git a/ext/phar/tests/tar/tar_002.phpt b/ext/phar/tests/tar/tar_002.phpt index 2674e416b8..cacc7391a2 100644 --- a/ext/phar/tests/tar/tar_002.phpt +++ b/ext/phar/tests/tar/tar_002.phpt @@ -29,6 +29,6 @@ try { @unlink(dirname(__FILE__) . '/tar_002.phar.tar'); ?> --EXPECTF-- -Warning: fopen(phar://%star_002.phar.tar/tar_002.phpt): failed to open stream: phar error: "%star_002.phar.tar" is a corrupted tar file in %star_002.php on line %d -Cannot open phar file '%star_002.phar.tar' with alias '(null)': phar error: "%star_002.phar.tar" is a corrupted tar file -===DONE=== \ No newline at end of file +Warning: fopen(phar://C:\sandbox\pecl\phar\tests\tar/tar_002.phar.tar/tar_002.phpt): failed to open stream: phar error: "C:\sandbox\pecl\phar\tests\tar\tar_002.phar.tar" is a corrupted tar file in C:\sandbox\pecl\phar\tests\tar\tar_002.php on line 9 +phar error: "C:\sandbox\pecl\phar\tests\tar\tar_002.phar.tar" is a corrupted tar file +===DONE=== diff --git a/ext/phar/tests/tar/tar_003.phpt b/ext/phar/tests/tar/tar_003.phpt index e7beecb55c..47f1d6ca9b 100644 --- a/ext/phar/tests/tar/tar_003.phpt +++ b/ext/phar/tests/tar/tar_003.phpt @@ -14,6 +14,7 @@ $alias = 'phar://' . $fname; $tar = new tarmaker($fname, 'none'); $tar->init(); +$tar->addFile('.phar/stub.php', "addFile('tar_003.phpt', $g = fopen(__FILE__, 'r')); $tar->addFile('internal/file/here', "hi there!\n"); $tar->mkDir('internal/dir'); @@ -24,7 +25,11 @@ fclose($g); echo file_get_contents($alias . '/internal/file/here'); +try { $tar = opendir($alias . '/'); +} catch (Exception $e) { +echo $e->getMessage()."\n"; +} while (false !== ($v = readdir($tar))) { echo (is_file($alias . '/' . $v) ? "file\n" : "dir\n"); @@ -50,6 +55,8 @@ closedir($tar); --EXPECT-- hi there! dir +.phar +dir dir dir internal @@ -57,9 +64,11 @@ file tar_003.phpt second round dir +.phar +dir dir dir internal file tar_003.phpt -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/phar/tests/tar/tar_nostub.phpt b/ext/phar/tests/tar/tar_nostub.phpt index a30e55b3cf..33b5c5dfaa 100644 --- a/ext/phar/tests/tar/tar_nostub.phpt +++ b/ext/phar/tests/tar/tar_nostub.phpt @@ -10,6 +10,7 @@ phar.readonly=1 include dirname(__FILE__) . '/files/tarmaker.php.inc'; $fname = dirname(__FILE__) . '/tar_004.phar.tar'; $alias = 'phar://' . $fname; +$fname2 = dirname(__FILE__) . '/tar_004.tar'; $tar = new tarmaker($fname, 'none'); $tar->init(); @@ -17,15 +18,30 @@ $tar->addFile('tar_004.php', 'addFile('internal/file/here', "hi there!\n"); $tar->close(); -$phar = new Phar($fname); -var_dump($phar->getStub()); +try { + $phar = new Phar($fname); + var_dump($phar->getStub()); +} catch (Exception $e) { + echo $e->getMessage()."\n"; +} + +copy($fname, $fname2); + +try { + $phar = new PharData($fname2); + var_dump($phar->getStub()); +} catch (Exception $e) { + echo $e->getMessage()."\n"; +} ?> ===DONE=== --CLEAN-- --EXPECTF-- +RecursiveDirectoryIterator::__construct(phar://%star_004.phar.tar/): failed to open dir: '%star_004.phar.tar' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive string(0) "" ===DONE=== diff --git a/ext/phar/tests/zf_test.phpt b/ext/phar/tests/zf_test.phpt index fa898c9a57..bc3580fb06 100644 --- a/ext/phar/tests/zf_test.phpt +++ b/ext/phar/tests/zf_test.phpt @@ -8,12 +8,14 @@ phar.readonly=0 convertToPhar(); +$phar->stopBuffering(); $phar = new Phar($phar_file); $phar->startBuffering(); @@ -34,14 +36,13 @@ foreach(new RecursiveIteratorIterator($phar) as $path) { ===DONE=== --CLEAN-- --EXPECTF-- -phar://%szf_test.phar/application/default/controllers/ErrorController.php -phar://%szf_test.phar/application/default/controllers/IndexController.php -phar://%szf_test.phar/application/default/views/scripts/error/error.phtml -phar://%szf_test.phar/application/default/views/scripts/index/index.phtml -phar://%szf_test.phar/html/.htaccess -phar://%szf_test.phar/html/index.php +phar://%szfapp.phar/application/default/controllers/ErrorController.php +phar://%szfapp.phar/application/default/controllers/IndexController.php +phar://%szfapp.phar/application/default/views/scripts/error/error.phtml +phar://%szfapp.phar/application/default/views/scripts/index/index.phtml +phar://%szfapp.phar/html/.htaccess +phar://%szfapp.phar/html/index.php ===DONE=== diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 9beffedf63..d7d3891b1c 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -377,7 +377,11 @@ foundit: int phar_open_or_create_zip(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */ { phar_archive_data *phar; - int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, &phar, error TSRMLS_CC); + int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, is_data, options, &phar, error TSRMLS_CC); + + if (FAILURE == ret) { + return FAILURE; + } if (pphar) { *pphar = phar; @@ -385,16 +389,6 @@ int phar_open_or_create_zip(char *fname, int fname_len, char *alias, int alias_l phar->is_data = is_data; - if (is_data) { - phar->is_writeable = 1; - phar->alias = NULL; - phar->alias_len = 0; - } - - if (FAILURE == ret) { - return FAILURE; - } - if (phar->is_zip) { return ret; }