]> granicus.if.org Git - php/commitdiff
add test for symbolic and hard links
authorGreg Beaver <cellog@php.net>
Sun, 20 Apr 2008 17:59:14 +0000 (17:59 +0000)
committerGreg Beaver <cellog@php.net>
Sun, 20 Apr 2008 17:59:14 +0000 (17:59 +0000)
ext/phar/tar.c
ext/phar/tests/tar/files/corrupt_tarmaker.php.inc
ext/phar/tests/tar/links.phpt [new file with mode: 0644]

index 38ba039f53ffe6779b5a6bd80a9eade410d52ae9..ca13e5ba1beff0a8b9ac7f4361d447fefc603630 100644 (file)
@@ -260,7 +260,7 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i
                if (entry.tar_type == TAR_LINK) {
                        if (!zend_hash_exists(&myphar->manifest, hdr->linkname, strlen(hdr->linkname))) {
                                if (error) {
-                                       spprintf(error, 4096, "phar error: \"%s\" is a corrupted tar file - symbolic link to non-existent file", fname);
+                                       spprintf(error, 4096, "phar error: \"%s\" is a corrupted tar file - hard link to non-existent file", fname);
                                }
                                efree(entry.filename);
                                php_stream_close(fp);
index 28fb8a48ead9584455251ae8cfe5cc880e4a5dc8..d8b8bc20ac2924f4f5be805ea5ecd39e3bc31df3 100644 (file)
@@ -60,6 +60,9 @@ class corrupt_tarmaker
             $type = 5;        // Directory
         } else if ($stat['mode'] & 0x8000) {
             $type = 0;        // Regular
+        } else if ($stat['mode'] & 0xA000 && $corrupt = 'symlink') {
+            $type = 2;        // Symbolic Link
+            $link = 'file1.txt';
         } else if ($stat['mode'] & 0xA000) {
             $type = 1;        // Link
             $link = 'file1.txt';
diff --git a/ext/phar/tests/tar/links.phpt b/ext/phar/tests/tar/links.phpt
new file mode 100644 (file)
index 0000000..f1201a6
--- /dev/null
@@ -0,0 +1,48 @@
+--TEST--
+Phar: tar with hard link and symbolic link
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--FILE--
+<?php
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.tar';
+$pname = 'phar://' . $fname;
+
+include dirname(__FILE__) . '/files/corrupt_tarmaker.php.inc';
+$a = new corrupt_tarmaker($fname, 'none');
+$a->init();
+$a->addFile('symlink', 'internal/file.txt', array(
+                    'mode' => 0xA000 + 0644,
+                    'uid' => 0,
+                    'gid' => 0,
+                    'size' => strlen('internal/file.txt'),
+                    'mtime' => time(),
+                ), 'symlink');
+$a->addFile('hardlink', 'internal/file.txt', array(
+                    'mode' => 0xA000 + 0644,
+                    'uid' => 0,
+                    'gid' => 0,
+                    'size' => strlen('internal/file.txt'),
+                    'mtime' => time(),
+                ));
+$a->addFile('internal/file.txt', 'hi there');
+$a->close();
+
+try {
+       $p = new PharData($fname);
+} catch (Exception $e) {
+       echo $e->getMessage() . "\n";
+}
+var_dump($p['symlink']->getContent());
+var_dump($p['hardlink']->getContent());
+var_dump($p['internal/file.txt']->getContent());
+?>
+===DONE===
+--CLEAN--
+<?php
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar');
+?>
+--EXPECTF--
+string(17) "internal/file.txt"
+string(17) "internal/file.txt"
+string(8) "hi there"
+===DONE===