diff options
author | Stanislav Malyshev <stas@php.net> | 2018-12-01 21:07:05 -0800 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2018-12-01 21:48:27 -0800 |
commit | cea277048d039c7b2a9253c44309a5b3dc7a99c4 (patch) | |
tree | 17c81156c7c7b8748f09c45e991a6a59e3b60907 | |
parent | 87bf84c8c7224ac85de77f7552068d4fce8b95c4 (diff) | |
parent | 69f5e7992bfc239e42a3a82e290399ca75bc56a6 (diff) | |
download | php-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-- | NEWS | 3 | ||||
-rw-r--r-- | ext/phar/phar_object.c | 15 | ||||
-rw-r--r-- | ext/phar/tests/bug77022.phpt | 32 | ||||
-rw-r--r-- | ext/phar/tests/stat.phpt | 1 |
4 files changed, 49 insertions, 2 deletions
@@ -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("")); |