Skip to content

Commit 01a3486

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix #70091: Phar does not mark UTF-8 filenames in ZIP archives
2 parents 372fb75 + 6a0b889 commit 01a3486

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ PHP NEWS
1313
- Phar:
1414
. Fixed bug #75850 (Unclear error message wrt. __halt_compiler() w/o
1515
semicolon) (cmb)
16+
. Fixed bug #70091 (Phar does not mark UTF-8 filenames in ZIP archives). (cmb)
1617

1718
21 Jan 2021, PHP 8.0.2
1819

ext/phar/tests/bug70091.phpt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
--TEST--
2+
Bug #70091 (Phar does not mark UTF-8 filenames in ZIP archives)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('phar')) die('skip phar extension not available');
6+
if (!extension_loaded('zlib')) die('skip zlib extension not available');
7+
?>
8+
--FILE--
9+
<?php
10+
$phar = new PharData(__DIR__ . '/bug70091.zip');
11+
$phar->addFromString('föö', '');
12+
$phar->addFromString('foo', '');
13+
unset($phar);
14+
15+
$stream = fopen(__DIR__ . '/bug70091.zip', 'r');
16+
17+
$data = fread($stream, 8);
18+
var_dump(unpack('H8sig/@6/nflags', $data));
19+
20+
fseek($stream, 53);
21+
$data = fread($stream, 8);
22+
var_dump(unpack('H8sig/@6/nflags', $data));
23+
24+
fseek($stream, 104);
25+
$data = fread($stream, 10);
26+
var_dump(unpack('H8sig/@8/nflags', $data));
27+
28+
fseek($stream, 173);
29+
$data = fread($stream, 10);
30+
var_dump(unpack('H8sig/@8/nflags', $data));
31+
?>
32+
--EXPECT--
33+
array(2) {
34+
["sig"]=>
35+
string(8) "504b0304"
36+
["flags"]=>
37+
int(8)
38+
}
39+
array(2) {
40+
["sig"]=>
41+
string(8) "504b0304"
42+
["flags"]=>
43+
int(8)
44+
}
45+
array(2) {
46+
["sig"]=>
47+
string(8) "504b0102"
48+
["flags"]=>
49+
int(8)
50+
}
51+
array(2) {
52+
["sig"]=>
53+
string(8) "504b0102"
54+
["flags"]=>
55+
int(8)
56+
}
57+
--CLEAN--
58+
<?php
59+
@unlink(__DIR__ . '/bug70091.zip');
60+
?>

ext/phar/zip.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,7 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
823823
zend_off_t offset;
824824
int not_really_modified = 0;
825825
p = (struct _phar_zip_pass*) arg;
826+
uint16_t general_purpose_flags;
826827

827828
if (entry->is_mounted) {
828829
return ZEND_HASH_APPLY_KEEP;
@@ -872,6 +873,11 @@ static int phar_zip_changed_apply_int(phar_entry_info *entry, void *arg) /* {{{
872873
memcpy(central.datestamp, local.datestamp, sizeof(local.datestamp));
873874
PHAR_SET_16(central.filename_len, entry->filename_len + (entry->is_dir ? 1 : 0));
874875
PHAR_SET_16(local.filename_len, entry->filename_len + (entry->is_dir ? 1 : 0));
876+
// set language encoding flag (all filenames have to be UTF-8 anyway)
877+
general_purpose_flags = PHAR_GET_16(central.flags);
878+
PHAR_SET_16(central.flags, general_purpose_flags | (1 << 11));
879+
general_purpose_flags = PHAR_GET_16(local.flags);
880+
PHAR_SET_16(local.flags, general_purpose_flags | (1 << 11));
875881
PHAR_SET_32(central.offset, php_stream_tell(p->filefp));
876882

877883
/* do extra field for perms later */

0 commit comments

Comments
 (0)