File tree 4 files changed +73
-24
lines changed
4 files changed +73
-24
lines changed Original file line number Diff line number Diff line change @@ -187,6 +187,12 @@ PHP_FUNCTION(pack)
187
187
}
188
188
convert_to_string_ex (argv [currentarg ]);
189
189
arg = Z_STRLEN_PP (argv [currentarg ]);
190
+ if (code == 'Z' ) {
191
+ /* add one because Z is always NUL-terminated:
192
+ * pack("Z*", "aa") === "aa\0"
193
+ * pack("Z2", "aa") === "a\0" */
194
+ arg ++ ;
195
+ }
190
196
}
191
197
192
198
currentarg ++ ;
@@ -317,17 +323,19 @@ PHP_FUNCTION(pack)
317
323
switch ((int ) code ) {
318
324
case 'a' :
319
325
case 'A' :
320
- case 'Z' :
326
+ case 'Z' : {
327
+ int arg_cp = (code != 'Z' ) ? arg : MAX (0 , arg - 1 );
321
328
memset (& output [outputpos ], (code == 'a' || code == 'Z' ) ? '\0' : ' ' , arg );
322
329
val = argv [currentarg ++ ];
323
330
if (Z_ISREF_PP (val )) {
324
331
SEPARATE_ZVAL (val );
325
332
}
326
333
convert_to_string_ex (val );
327
334
memcpy (& output [outputpos ], Z_STRVAL_PP (val ),
328
- (Z_STRLEN_PP (val ) < arg ) ? Z_STRLEN_PP (val ) : arg );
335
+ (Z_STRLEN_PP (val ) < arg_cp ) ? Z_STRLEN_PP (val ) : arg_cp );
329
336
outputpos += arg ;
330
337
break ;
338
+ }
331
339
332
340
case 'h' :
333
341
case 'H' : {
Original file line number Diff line number Diff line change 1
1
--TEST--
2
- BugFix #61038
2
+ Bug #61038: unpack("a5", "str\0\0") does not work as expected
3
3
--FILE--
4
4
<?php
5
- var_dump (unpack ("Z4 " , pack ("Z4 " , "foo " )));
6
- var_dump (unpack ("a4 " , pack ("a4 " , "foo " )));
7
- var_dump (unpack ("A4 " , pack ("A4 " , "foo " )));
8
- var_dump (unpack ("a9 " , pack ("a* " , "foo \x00bar \x00 " )));
9
- var_dump (unpack ("A9 " , pack ("a* " , "foo \x00bar \x00 " )));
10
- var_dump (unpack ("Z9 " , pack ("a* " , "foo \x00bar \x00 " )));
5
+ var_dump (unpack ("a4 " , "str \0\0" ));
6
+ var_dump (unpack ("a5 " , "str \0\0" ));
7
+ var_dump (unpack ("a6 " , "str \0\0" ));
8
+ var_dump (unpack ("a* " , "str \0\0" ));
11
9
?>
12
10
--EXPECTF--
13
11
array(1) {
14
12
[1]=>
15
- string(3 ) "foo "
13
+ string(4 ) "str%c "
16
14
}
17
15
array(1) {
18
16
[1]=>
19
- string(4) "foo%c"
20
- }
21
- array(1) {
22
- [1]=>
23
- string(3) "foo"
24
- }
25
- array(1) {
26
- [1]=>
27
- string(9) "foo%cbar%c "
28
- }
29
- array(1) {
30
- [1]=>
31
- string(7) "foo%cbar"
17
+ string(5) "str%c%c"
32
18
}
19
+
20
+ Warning: unpack(): Type a: not enough input, need 6, have 5 in %s on line %d
21
+ bool(false)
33
22
array(1) {
34
23
[1]=>
35
- string(3 ) "foo "
24
+ string(5 ) "str%c%c "
36
25
}
37
26
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ pack()/unpack(): "A" modifier
3
+ --FILE--
4
+ <?php
5
+ var_dump (
6
+ pack ("A5 " , "foo " ),
7
+ pack ("A4 " , "fooo " ),
8
+ pack ("A4 " , "foo " ),
9
+ unpack ("A* " , "foo \0\rbar \0 \t\r\n" ),
10
+ unpack ("A4 " , "foo \0\rbar \0 \t\r\n" )
11
+ );
12
+ ?>
13
+ --EXPECTF--
14
+ string(5) "foo "
15
+ string(4) "fooo"
16
+ string(4) "foo "
17
+ array(1) {
18
+ [1]=>
19
+ string(8) "foo%c%cbar"
20
+ }
21
+ array(1) {
22
+ [1]=>
23
+ string(3) "foo"
24
+ }
25
+
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ pack()/unpack(): "Z" format
3
+ --FILE--
4
+ <?php
5
+ var_dump (
6
+ pack ("Z0 " , "f " ),
7
+ pack ("Z5 " , "foo \0" ),
8
+ pack ("Z4 " , "fooo " ),
9
+ pack ("Z4 " , "foo " ),
10
+ pack ("Z* " , "foo " ),
11
+ unpack ("Z* " , "foo \0\rbar \0 \t\r\n" ),
12
+ unpack ("Z9 " , "foo \0\rbar \0 \t\r\n" )
13
+ );
14
+ --EXPECTF --
15
+ string (0 ) ""
16
+ string (5 ) "foo%c%c "
17
+ string (4 ) "foo%c "
18
+ string (4 ) "foo%c "
19
+ string (4 ) "foo%c "
20
+ array (1 ) {
21
+ [1 ]=>
22
+ string(3 ) "foo "
23
+ }
24
+ array (1 ) {
25
+ [1 ]=>
26
+ string(3 ) "foo "
27
+ }
You can’t perform that action at this time.
0 commit comments