diff options
Diffstat (limited to 'ext/standard/pack.c')
-rw-r--r-- | ext/standard/pack.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/ext/standard/pack.c b/ext/standard/pack.c index a24ee69ad2..1d353d1743 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -551,9 +551,10 @@ PHP_FUNCTION(unpack) zend_string *formatarg, *inputarg; zend_long formatlen, inputpos, inputlen; int i; + zend_long offset = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &formatarg, - &inputarg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|l", &formatarg, + &inputarg, &offset) == FAILURE) { return; } @@ -563,6 +564,14 @@ PHP_FUNCTION(unpack) inputlen = ZSTR_LEN(inputarg); inputpos = 0; + + if (offset < 0 || offset > inputlen) { + php_error_docref(NULL, E_WARNING, "Offset " ZEND_LONG_FMT " is out of input range" , offset); + RETURN_FALSE; + } + input += offset; + inputlen -= offset; + array_init(return_value); while (formatlen-- > 0) { |