}
convert_to_string_ex(argv[currentarg]);
arg = Z_STRLEN_PP(argv[currentarg]);
+ if (code == 'Z') {
+ /* add one because Z is always NUL-terminated:
+ * pack("Z*", "aa") === "aa\0"
+ * pack("Z2", "aa") === "a\0" */
+ arg++;
+ }
}
currentarg++;
switch ((int) code) {
case 'a':
case 'A':
- case 'Z':
+ case 'Z': {
+ int arg_cp = (code != 'Z') ? arg : MAX(0, arg - 1);
memset(&output[outputpos], (code == 'a' || code == 'Z') ? '\0' : ' ', arg);
val = argv[currentarg++];
if (Z_ISREF_PP(val)) {
}
convert_to_string_ex(val);
memcpy(&output[outputpos], Z_STRVAL_PP(val),
- (Z_STRLEN_PP(val) < arg) ? Z_STRLEN_PP(val) : arg);
+ (Z_STRLEN_PP(val) < arg_cp) ? Z_STRLEN_PP(val) : arg_cp);
outputpos += arg;
break;
+ }
case 'h':
case 'H': {
--TEST--
-BugFix #61038
+Bug #61038: unpack("a5", "str\0\0") does not work as expected
--FILE--
<?php
- var_dump(unpack("Z4", pack("Z4", "foo")));
- var_dump(unpack("a4", pack("a4", "foo")));
- var_dump(unpack("A4", pack("A4", "foo")));
- var_dump(unpack("a9", pack("a*", "foo\x00bar\x00 ")));
- var_dump(unpack("A9", pack("a*", "foo\x00bar\x00 ")));
- var_dump(unpack("Z9", pack("a*", "foo\x00bar\x00 ")));
+var_dump(unpack("a4", "str\0\0"));
+var_dump(unpack("a5", "str\0\0"));
+var_dump(unpack("a6", "str\0\0"));
+var_dump(unpack("a*", "str\0\0"));
?>
--EXPECTF--
array(1) {
[1]=>
- string(3) "foo"
+ string(4) "str%c"
}
array(1) {
[1]=>
- string(4) "foo%c"
-}
-array(1) {
- [1]=>
- string(3) "foo"
-}
-array(1) {
- [1]=>
- string(9) "foo%cbar%c "
-}
-array(1) {
- [1]=>
- string(7) "foo%cbar"
+ string(5) "str%c%c"
}
+
+Warning: unpack(): Type a: not enough input, need 6, have 5 in %s on line %d
+bool(false)
array(1) {
[1]=>
- string(3) "foo"
+ string(5) "str%c%c"
}
--- /dev/null
+--TEST--
+pack()/unpack(): "A" modifier
+--FILE--
+<?php
+var_dump(
+ pack("A5", "foo "),
+ pack("A4", "fooo"),
+ pack("A4", "foo"),
+ unpack("A*", "foo\0\rbar\0 \t\r\n"),
+ unpack("A4", "foo\0\rbar\0 \t\r\n")
+);
+?>
+--EXPECTF--
+string(5) "foo "
+string(4) "fooo"
+string(4) "foo "
+array(1) {
+ [1]=>
+ string(8) "foo%c%cbar"
+}
+array(1) {
+ [1]=>
+ string(3) "foo"
+}
+
--- /dev/null
+--TEST--
+pack()/unpack(): "Z" format
+--FILE--
+<?php
+var_dump(
+ pack("Z0", "f"),
+ pack("Z5", "foo\0"),
+ pack("Z4", "fooo"),
+ pack("Z4", "foo"),
+ pack("Z*", "foo"),
+ unpack("Z*", "foo\0\rbar\0 \t\r\n"),
+ unpack("Z9", "foo\0\rbar\0 \t\r\n")
+);
+--EXPECTF--
+string(0) ""
+string(5) "foo%c%c"
+string(4) "foo%c"
+string(4) "foo%c"
+string(4) "foo%c"
+array(1) {
+ [1]=>
+ string(3) "foo"
+}
+array(1) {
+ [1]=>
+ string(3) "foo"
+}