summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/standard/pack.c4
-rw-r--r--ext/standard/tests/strings/unpack_bug68225.phpt39
2 files changed, 41 insertions, 2 deletions
diff --git a/ext/standard/pack.c b/ext/standard/pack.c
index 4af72c34b8..85709bc9f1 100644
--- a/ext/standard/pack.c
+++ b/ext/standard/pack.c
@@ -560,7 +560,7 @@ PHP_FUNCTION(unpack)
{
char *format, *input;
zend_string *formatarg, *inputarg;
- size_t formatlen, inputpos, inputlen;
+ zend_long formatlen, inputpos, inputlen;
int i;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &formatarg,
@@ -717,7 +717,7 @@ PHP_FUNCTION(unpack)
inputpos = 0;
}
- if ((size >=0 && (inputpos + size) <= inputlen) || (size < 0 && -size <= (inputlen - inputpos))) {
+ if ((inputpos + size) <= inputlen) {
switch ((int) type) {
case 'a': {
/* a will not strip any trailing whitespace or null padding */
diff --git a/ext/standard/tests/strings/unpack_bug68225.phpt b/ext/standard/tests/strings/unpack_bug68225.phpt
new file mode 100644
index 0000000000..7f8cdd4701
--- /dev/null
+++ b/ext/standard/tests/strings/unpack_bug68225.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Bug #68225 unpack and X format code
+--FILE--
+<?php
+
+$data = pack('VV', 1, 2);
+
+$result = unpack('Va/X' ,$data);
+var_dump($result);
+
+$result = unpack('Va/X4' ,$data);
+var_dump($result);
+
+$result = unpack('V1a/X4/V1b/V1c/X4/V1d', $data);
+var_dump($result);
+
+?>
+===DONE===
+--EXPECTF--
+array(1) {
+ ["a"]=>
+ int(1)
+}
+array(1) {
+ ["a"]=>
+ int(1)
+}
+array(4) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ int(1)
+ ["c"]=>
+ int(2)
+ ["d"]=>
+ int(2)
+}
+===DONE===
+