summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2018-12-01 21:07:05 -0800
committerStanislav Malyshev <stas@php.net>2018-12-01 21:48:27 -0800
commitcea277048d039c7b2a9253c44309a5b3dc7a99c4 (patch)
tree17c81156c7c7b8748f09c45e991a6a59e3b60907
parent87bf84c8c7224ac85de77f7552068d4fce8b95c4 (diff)
parent69f5e7992bfc239e42a3a82e290399ca75bc56a6 (diff)
downloadphp-git-cea277048d039c7b2a9253c44309a5b3dc7a99c4.tar.gz
Merge branch 'PHP-5.6' into PHP-7.0
* PHP-5.6: Fix bug #77022 - use file mode or umask for new files
-rw-r--r--NEWS3
-rw-r--r--ext/phar/phar_object.c15
-rw-r--r--ext/phar/tests/bug77022.phpt32
-rw-r--r--ext/phar/tests/stat.phpt1
4 files changed, 49 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 2baed79dfb..8110f57cc6 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ PHP NEWS
. Fixed bug #77153 (imap_open allows to run arbitrary shell commands via
mailbox parameter). (Stas)
+- Phar:
+ . Fixed bug #77022 (PharData always creates new files with mode 0666). (Stas)
+
13 Sep 2018 PHP 7.0.32
- Apache2
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index bfbbd1479b..539ef50f8f 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -3663,7 +3663,8 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, int filenam
char *error;
size_t contents_len;
phar_entry_data *data;
- php_stream *contents_file;
+ php_stream *contents_file = NULL;
+ php_stream_statbuf ssb;
if (filename_len >= sizeof(".phar")-1 && !memcmp(filename, ".phar", sizeof(".phar")-1) && (filename[5] == '/' || filename[5] == '\\' || filename[5] == '\0')) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot create any files in magic \".phar\" directory", (*pphar)->fname);
@@ -3697,10 +3698,20 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, int filenam
}
php_stream_copy_to_stream_ex(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len);
}
-
data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len;
}
+ if (contents_file != NULL && php_stream_stat(contents_file, &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
+ }
+
/* check for copy-on-write */
if (pphar[0] != data->phar) {
*pphar = data->phar;
diff --git a/ext/phar/tests/bug77022.phpt b/ext/phar/tests/bug77022.phpt
new file mode 100644
index 0000000000..66bcf66dd4
--- /dev/null
+++ b/ext/phar/tests/bug77022.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Phar: Bug #77022: PharData always creates new files with mode 0666
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--FILE--
+<?php
+umask(022);
+var_dump(decoct(umask()));
+
+$sFile = tempnam(__DIR__, 'test77022');
+var_dump(decoct(stat($sFile)['mode']));
+
+foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
+ $phar = new PharData(__DIR__ . '/test77022.' . $ext, null, null, $mode);
+ $phar->addFile($sFile, 'test-file-phar');
+ $phar->addFromString("test-from-string", 'test-file-phar');
+ $phar->extractTo(__DIR__);
+ var_dump(decoct(stat(__DIR__ . '/test-file-phar')['mode']));
+ var_dump(decoct(stat(__DIR__ . '/test-from-string')['mode']));
+ unlink(__DIR__ . '/test-file-phar');
+ unlink(__DIR__ . '/test-from-string');
+ unlink(__DIR__ . '/test77022.' . $ext);
+}
+unlink($sFile);
+?>
+--EXPECT--
+string(2) "22"
+string(6) "100600"
+string(6) "100600"
+string(6) "100644"
+string(6) "100600"
+string(6) "100644" \ No newline at end of file
diff --git a/ext/phar/tests/stat.phpt b/ext/phar/tests/stat.phpt
index 184aa6d2ec..3e34aea944 100644
--- a/ext/phar/tests/stat.phpt
+++ b/ext/phar/tests/stat.phpt
@@ -7,6 +7,7 @@ phar.require_hash=1
phar.readonly=0
--FILE--
<?php
+umask(0);
Phar::interceptFileFuncs();
var_dump(stat(""));