]> granicus.if.org Git - php/commitdiff
fix PHP Bug #48377: error message unclear on converting phar with existing file
authorGreg Beaver <cellog@php.net>
Thu, 23 Jul 2009 17:04:24 +0000 (17:04 +0000)
committerGreg Beaver <cellog@php.net>
Thu, 23 Jul 2009 17:04:24 +0000 (17:04 +0000)
ext/phar/phar_object.c
ext/phar/tests/bug48377.2.phpt [new file with mode: 0644]
ext/phar/tests/bug48377.phpt [new file with mode: 0644]

index a529c50eabbed1e8923ba8ab03ae3710ba4f759a..285ebafc86070536a77eb9e082cc71699d4a7acd 100755 (executable)
@@ -2037,6 +2037,7 @@ static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool c
        int ext_len = ext ? strlen(ext) : 0;
        int oldname_len;
        phar_archive_data **pphar = NULL;
+       php_stream_statbuf ssb;
 
        if (!ext) {
                if (phar->is_zip) {
@@ -2107,6 +2108,8 @@ static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool c
        spprintf(&newname, 0, "%s.%s", strtok(basename, "."), ext);
        efree(basename);
 
+       
+
        basepath = estrndup(oldpath, (strlen(oldpath) - oldname_len));
        phar->fname_len = spprintf(&newpath, 0, "%s%s", basepath, newname);
        phar->fname = newpath;
@@ -2142,6 +2145,11 @@ static zval *phar_rename_archive(phar_archive_data *phar, char *ext, zend_bool c
                return NULL;
        }
 its_ok:
+       if (SUCCESS == php_stream_stat_path(newpath, &ssb)) {
+               efree(oldpath);
+               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "phar \"%s\" exists and must be unlinked prior to conversion", newpath);
+               return NULL;
+       }
        if (!phar->is_data) {
                if (SUCCESS != phar_detect_phar_fname_ext(newpath, phar->fname_len, (const char **) &(phar->ext), &(phar->ext_len), 1, 1, 1 TSRMLS_CC)) {
                        efree(oldpath);
diff --git a/ext/phar/tests/bug48377.2.phpt b/ext/phar/tests/bug48377.2.phpt
new file mode 100644 (file)
index 0000000..be2a0e1
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Phar: PHP bug #48377 "error message unclear on converting phar with existing file" test #2
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip';
+
+$phar = new PharData($fname);
+$phar['x'] = 'hi';
+try {
+       $phar->convertToData(Phar::ZIP, Phar::NONE, '.2.phar.zip');
+} catch (BadMethodCallException $e) {
+       echo $e->getMessage(),"\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?>
+--EXPECTF--
+data phar "%sbug48377.2.phar.zip" has invalid extension 2.phar.zip
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/bug48377.phpt b/ext/phar/tests/bug48377.phpt
new file mode 100644 (file)
index 0000000..6282a15
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Phar: PHP bug #48377 "error message unclear on converting phar with existing file"
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar';
+$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.zip';
+
+touch($fname2);
+
+$phar = new Phar($fname, 0, 'a.phar');
+$phar['x'] = 'hi';
+try {
+       $phar->convertToData(Phar::ZIP, Phar::NONE, 'zip');
+} catch (BadMethodCallException $e) {
+       echo $e->getMessage(),"\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar');?>
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.zip');?>
+--EXPECTF--
+phar "%sbug48377.zip" exists and must be unlinked prior to conversion
+===DONE===
\ No newline at end of file