]> granicus.if.org Git - php/commitdiff
new test for Phar::isValidPharFilename. Fix Phar::isValidPharFilename. Fix extensio...
authorGreg Beaver <cellog@php.net>
Wed, 23 Apr 2008 18:11:20 +0000 (18:11 +0000)
committerGreg Beaver <cellog@php.net>
Wed, 23 Apr 2008 18:11:20 +0000 (18:11 +0000)
ext/phar/phar.c
ext/phar/phar_object.c
ext/phar/tests/phar_isvalidpharfilename.phpt [new file with mode: 0644]

index 974e131153fcbb393c86f2467888b5320075ebb9..481930b976a6184cc773de4b12db2e4e73e3f004 100644 (file)
@@ -1500,7 +1500,8 @@ static int phar_check_str(const char *fname, const char *ext_str, int ext_len, i
                test[ext_len + 1] = '\0';
                /* executable phars must contain ".phar" as a valid extension (phar://.pharmy/oops is invalid) */
                /* (phar://hi/there/.phar/oops is also invalid) */
-               if ((pos = strstr(test, ".phar")) && (*(pos - 1) != '/')
+               pos = strstr(test, ".phar");
+               if (pos && (*(pos - 1) != '/')
                                && (pos += 5) && (*pos == '\0' || *pos == '/' || *pos == '.')) {
                        return phar_analyze_path(fname, ext_str, ext_len, for_create TSRMLS_CC);
                } else {
@@ -1508,7 +1509,9 @@ static int phar_check_str(const char *fname, const char *ext_str, int ext_len, i
                }
        }
        /* data phars need only contain a single non-"." to be valid */
-       if (*(ext_str + 1) != '.' && *(ext_str + 1) != '/' && *(ext_str + 1) != '\0') {
+       pos = strstr(ext_str, ".phar");
+       if (!(pos && (*(pos - 1) != '/')
+                               && (pos += 5) && (*pos == '\0' || *pos == '/' || *pos == '.')) && *(ext_str + 1) != '.' && *(ext_str + 1) != '/' && *(ext_str + 1) != '\0') {
                return phar_analyze_path(fname, ext_str, ext_len, for_create TSRMLS_CC);
        }
        return FAILURE;
@@ -1596,6 +1599,12 @@ next_extension:
        if (!pos) {
                return FAILURE;
        }
+       if (pos != filename && (*(pos - 1) == '/' || *(pos - 1) == '\0')) {
+               pos = strchr(pos + 1, '.');
+               if (!pos) {
+                       return FAILURE;
+               }
+       }
 
        slash = strchr(pos, '/');
        if (!slash) {
index 827968439a683ae5ad07f156a468c1e9f65cc6ae..294eee14662b39761afa980b3fc3681650cb56b3 100755 (executable)
@@ -1095,12 +1095,12 @@ PHP_METHOD(Phar, isValidPharFilename)
        int fname_len, ext_len;
        zend_bool executable = 1;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len, &executable) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &fname, &fname_len, &executable) == FAILURE) {
                return;
        }
 
        fname_len = executable;
-       RETURN_BOOL(phar_detect_phar_fname_ext(fname, 1, &ext_str, &ext_len, fname_len, executable, 1 TSRMLS_CC) == SUCCESS);
+       RETVAL_BOOL(phar_detect_phar_fname_ext(fname, 1, &ext_str, &ext_len, fname_len, 2, 1 TSRMLS_CC) == SUCCESS);
 }
 /* }}} */
 
diff --git a/ext/phar/tests/phar_isvalidpharfilename.phpt b/ext/phar/tests/phar_isvalidpharfilename.phpt
new file mode 100644 (file)
index 0000000..f5b0c8d
--- /dev/null
@@ -0,0 +1,142 @@
+--TEST--
+Phar: Phar::isValidPharFilename()
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip");?>
+--INI--
+phar.readonly=1
+--FILE--
+<?php
+chdir(dirname(__FILE__));
+Phar::isValidPharFilename(array());
+echo "*\n";
+var_dump(Phar::isValidPharFilename('*'));
+var_dump(Phar::isValidPharFilename('*', true));
+var_dump(Phar::isValidPharFilename('*', false));
+
+echo "\nboo.phar\n";
+var_dump(Phar::isValidPharFilename('boo.phar'));
+var_dump(Phar::isValidPharFilename('boo.phar', true));
+var_dump(Phar::isValidPharFilename('boo.phar', false));
+
+echo "\nboo.tar\n";
+var_dump(Phar::isValidPharFilename('boo.tar'));
+var_dump(Phar::isValidPharFilename('boo.tar', true));
+var_dump(Phar::isValidPharFilename('boo.tar', false));
+
+echo "\nboo.phar.tar\n";
+var_dump(Phar::isValidPharFilename('boo.phar.tar'));
+var_dump(Phar::isValidPharFilename('boo.phar.tar', true));
+var_dump(Phar::isValidPharFilename('boo.phar.tar', false));
+
+mkdir(dirname(__FILE__) . '/.phar');
+
+echo "\n.phar/boo.tar\n";
+var_dump(Phar::isValidPharFilename('.phar/boo.tar'));
+var_dump(Phar::isValidPharFilename('.phar/boo.tar', true));
+var_dump(Phar::isValidPharFilename('.phar/boo.tar', false));
+
+echo "\n.phar.tar\n";
+var_dump(Phar::isValidPharFilename('.phar.tar'));
+var_dump(Phar::isValidPharFilename('.phar.tar', true));
+var_dump(Phar::isValidPharFilename('.phar.tar', false));
+
+echo "\n.phar.phar\n";
+var_dump(Phar::isValidPharFilename('.phar.phar'));
+var_dump(Phar::isValidPharFilename('.phar.phar', true));
+var_dump(Phar::isValidPharFilename('.phar.phar', false));
+
+echo "\n.phar.phart\n";
+var_dump(Phar::isValidPharFilename('.phar.phart'));
+var_dump(Phar::isValidPharFilename('.phar.phart', true));
+var_dump(Phar::isValidPharFilename('.phar.phart', false));
+
+echo "\nmy.pharmy\n";
+var_dump(Phar::isValidPharFilename('my.pharmy'));
+var_dump(Phar::isValidPharFilename('my.pharmy', true));
+var_dump(Phar::isValidPharFilename('my.pharmy', false));
+
+echo "\nphar.zip\n";
+var_dump(Phar::isValidPharFilename('phar.zip'));
+var_dump(Phar::isValidPharFilename('phar.zip', true));
+var_dump(Phar::isValidPharFilename('phar.zip', false));
+
+echo "\nphar.zip.phar\n";
+var_dump(Phar::isValidPharFilename('phar.zip.phar'));
+var_dump(Phar::isValidPharFilename('phar.zip.phar', true));
+var_dump(Phar::isValidPharFilename('phar.zip.phar', false));
+
+ini_set('phar.extract_list', 'myphar.phar=' . dirname(__FILE__));
+
+echo "\nmyphar.phar\n";
+var_dump(Phar::isValidPharFilename('myphar.phar'));
+var_dump(Phar::isValidPharFilename('myphar.phar', true));
+var_dump(Phar::isValidPharFilename('myphar.phar', false));
+
+?>
+===DONE===
+--CLEAN--
+<?php
+rmdir(dirname(__FILE__) . '/.phar');
+--EXPECTF--
+Warning: Phar::isValidPharFilename() expects parameter 1 to be string, array given in %sphar_isvalidpharfilename.php on line %d
+*
+bool(false)
+bool(false)
+bool(false)
+
+boo.phar
+bool(true)
+bool(true)
+bool(false)
+
+boo.tar
+bool(false)
+bool(false)
+bool(true)
+
+boo.phar.tar
+bool(true)
+bool(true)
+bool(false)
+
+.phar/boo.tar
+bool(false)
+bool(false)
+bool(true)
+
+.phar.tar
+bool(false)
+bool(false)
+bool(true)
+
+.phar.phar
+bool(true)
+bool(true)
+bool(false)
+
+.phar.phart
+bool(false)
+bool(false)
+bool(true)
+
+my.pharmy
+bool(false)
+bool(false)
+bool(true)
+
+phar.zip
+bool(false)
+bool(false)
+bool(true)
+
+phar.zip.phar
+bool(true)
+bool(true)
+bool(false)
+
+myphar.phar
+bool(true)
+bool(true)
+bool(false)
+===DONE===
+