mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fix bug #79082 - Files added to tar with Phar::buildFromIterator have all-access permissions
This commit is contained in:
parent
282bfb109e
commit
bbcb8cab8c
4 changed files with 65 additions and 0 deletions
|
@ -1419,6 +1419,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);
|
||||
|
||||
|
@ -1686,6 +1687,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) {
|
||||
|
|
52
ext/phar/tests/bug79082.phpt
Normal file
52
ext/phar/tests/bug79082.phpt
Normal file
|
@ -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"
|
1
ext/phar/tests/test79082/test79082-testfile
Normal file
1
ext/phar/tests/test79082/test79082-testfile
Normal file
|
@ -0,0 +1 @@
|
|||
test
|
1
ext/phar/tests/test79082/test79082-testfile2
Normal file
1
ext/phar/tests/test79082/test79082-testfile2
Normal file
|
@ -0,0 +1 @@
|
|||
test
|
Loading…
Add table
Add a link
Reference in a new issue