Skip to content

Commit 1aec05d

Browse files
committed
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: Fix bug #77022 - use file mode or umask for new files
2 parents 223b8c1 + 67f3615 commit 1aec05d

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

ext/phar/phar_object.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3637,7 +3637,8 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, int filenam
36373637
char *error;
36383638
size_t contents_len;
36393639
phar_entry_data *data;
3640-
php_stream *contents_file;
3640+
php_stream *contents_file = NULL;
3641+
php_stream_statbuf ssb;
36413642

36423643
if (filename_len >= (int)sizeof(".phar")-1) {
36433644
start_pos = ('/' == filename[0] ? 1 : 0); /* account for any leading slash: multiple-leads handled elsewhere */
@@ -3674,10 +3675,20 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, int filenam
36743675
}
36753676
php_stream_copy_to_stream_ex(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len);
36763677
}
3677-
36783678
data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len;
36793679
}
36803680

3681+
if (contents_file != NULL && php_stream_stat(contents_file, &ssb TSRMLS_CC) != -1) {
3682+
data->internal_file->flags = ssb.sb.st_mode & PHAR_ENT_PERM_MASK ;
3683+
} else {
3684+
#ifndef _WIN32
3685+
mode_t mask;
3686+
mask = umask(0);
3687+
umask(mask);
3688+
data->internal_file->flags &= ~mask;
3689+
#endif
3690+
}
3691+
36813692
/* check for copy-on-write */
36823693
if (pphar[0] != data->phar) {
36833694
*pphar = data->phar;

ext/phar/tests/bug77022.phpt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--TEST--
2+
Phar: Bug #77022: PharData always creates new files with mode 0666
3+
--SKIPIF--
4+
<?php if (!extension_loaded("phar")) die("skip"); ?>
5+
--FILE--
6+
<?php
7+
umask(022);
8+
var_dump(decoct(umask()));
9+
10+
$sFile = tempnam(__DIR__, 'test77022');
11+
var_dump(decoct(stat($sFile)['mode']));
12+
13+
foreach([Phar::TAR => 'tar', Phar::ZIP => 'zip'] as $mode => $ext) {
14+
$phar = new PharData(__DIR__ . '/test77022.' . $ext, null, null, $mode);
15+
$phar->addFile($sFile, 'test-file-phar');
16+
$phar->addFromString("test-from-string", 'test-file-phar');
17+
$phar->extractTo(__DIR__);
18+
var_dump(decoct(stat(__DIR__ . '/test-file-phar')['mode']));
19+
var_dump(decoct(stat(__DIR__ . '/test-from-string')['mode']));
20+
unlink(__DIR__ . '/test-file-phar');
21+
unlink(__DIR__ . '/test-from-string');
22+
unlink(__DIR__ . '/test77022.' . $ext);
23+
}
24+
unlink($sFile);
25+
?>
26+
--EXPECT--
27+
string(2) "22"
28+
string(6) "100600"
29+
string(6) "100600"
30+
string(6) "100644"
31+
string(6) "100600"
32+
string(6) "100644"

ext/phar/tests/stat.phpt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ phar.require_hash=1
77
phar.readonly=0
88
--FILE--
99
<?php
10+
umask(0);
1011
Phar::interceptFileFuncs();
1112
var_dump(stat(""));
1213

0 commit comments

Comments
 (0)