]> granicus.if.org Git - php/commitdiff
Fix bug #79082 - Files added to tar with Phar::buildFromIterator have all-access...
authorStanislav Malyshev <stas@php.net>
Sun, 16 Feb 2020 06:17:14 +0000 (22:17 -0800)
committerStanislav Malyshev <stas@php.net>
Mon, 17 Feb 2020 08:19:30 +0000 (00:19 -0800)
ext/phar/phar_object.c
ext/phar/tests/bug79082.phpt [new file with mode: 0644]
ext/phar/tests/test79082/test79082-testfile [new file with mode: 0644]
ext/phar/tests/test79082/test79082-testfile2 [new file with mode: 0644]

index e44bb56231450647a21ffa672966bbc4303f7d7a..14b4a795d01edb8581d80c537c4fbee05debd1b3 100644 (file)
@@ -1404,6 +1404,7 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
        char *str_key;
        zend_class_entry *ce = p_obj->c;
        phar_archive_object *phar_obj = p_obj->p;
+       php_stream_statbuf ssb;
 
        value = iter->funcs->get_current_data(iter);
 
@@ -1671,6 +1672,16 @@ after_open_fp:
                php_stream_copy_to_stream_ex(fp, p_obj->fp, PHP_STREAM_COPY_ALL, &contents_len);
                data->internal_file->uncompressed_filesize = data->internal_file->compressed_filesize =
                        php_stream_tell(p_obj->fp) - data->internal_file->offset;
+               if (php_stream_stat(fp, &ssb) != -1) {
+                       data->internal_file->flags = ssb.sb.st_mode & PHAR_ENT_PERM_MASK ;
+               } else {
+#ifndef _WIN32
+                       mode_t mask;
+                       mask = umask(0);
+                       umask(mask);
+                       data->internal_file->flags &= ~mask;
+#endif
+               }
        }
 
        if (close_fp) {
diff --git a/ext/phar/tests/bug79082.phpt b/ext/phar/tests/bug79082.phpt
new file mode 100644 (file)
index 0000000..ca453d1
--- /dev/null
@@ -0,0 +1,52 @@
+--TEST--
+Phar: Bug #79082: Files added to tar with Phar::buildFromIterator have all-access permissions
+--SKIPIF--
+<?php 
+if (!extension_loaded("phar")) die("skip"); 
+if (defined("PHP_WINDOWS_VERSION_MAJOR")) die("skip not for Windows")
+?>
+--FILE--
+<?php
+umask(022);
+var_dump(decoct(umask()));
+chmod(__DIR__ . '/test79082/test79082-testfile', 0644);
+chmod(__DIR__ . '/test79082/test79082-testfile2', 0400);
+
+foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
+       clearstatcache();
+       $phar = new PharData(__DIR__ . '/test79082.' . $ext, null, null, $mode);
+       $phar->buildFromIterator(new \RecursiveDirectoryIterator(__DIR__ . '/test79082', \FilesystemIterator::SKIP_DOTS), __DIR__ . '/test79082');
+       $phar->extractTo(__DIR__);
+       var_dump(decoct(stat(__DIR__ . '/test79082-testfile')['mode']));
+       var_dump(decoct(stat(__DIR__ . '/test79082-testfile2')['mode']));
+       unlink(__DIR__ . '/test79082-testfile');
+       unlink(__DIR__ . '/test79082-testfile2');
+}
+foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
+       clearstatcache();
+       $phar = new PharData(__DIR__ . '/test79082-d.' . $ext, null, null, $mode);
+       $phar->buildFromDirectory(__DIR__ . '/test79082');
+       $phar->extractTo(__DIR__);
+       var_dump(decoct(stat(__DIR__ . '/test79082-testfile')['mode']));
+       var_dump(decoct(stat(__DIR__ . '/test79082-testfile2')['mode']));
+       unlink(__DIR__ . '/test79082-testfile');
+       unlink(__DIR__ . '/test79082-testfile2');
+}
+?>
+--CLEAN--
+<?
+unlink(__DIR__ . '/test79082.tar');
+unlink(__DIR__ . '/test79082.zip');
+unlink(__DIR__ . '/test79082-d.tar');
+unlink(__DIR__ . '/test79082-d.zip');
+?>
+--EXPECT--
+string(2) "22"
+string(6) "100644"
+string(6) "100400"
+string(6) "100644"
+string(6) "100400"
+string(6) "100644"
+string(6) "100400"
+string(6) "100644"
+string(6) "100400"
diff --git a/ext/phar/tests/test79082/test79082-testfile b/ext/phar/tests/test79082/test79082-testfile
new file mode 100644 (file)
index 0000000..9daeafb
--- /dev/null
@@ -0,0 +1 @@
+test
diff --git a/ext/phar/tests/test79082/test79082-testfile2 b/ext/phar/tests/test79082/test79082-testfile2
new file mode 100644 (file)
index 0000000..9daeafb
--- /dev/null
@@ -0,0 +1 @@
+test