@@ -529,9 +529,9 @@ static long php_unpack(char *data, zend_str_size_int size, int issigned, int *ma
529
529
PHP_FUNCTION (unpack )
530
530
{
531
531
char * format , * input , * formatarg , * inputarg ;
532
- int formatlen ;
533
532
zend_str_size_int formatarg_len , inputarg_len ;
534
- int inputpos , inputlen , i ;
533
+ zend_str_size_int formatlen , inputpos , inputlen ;
534
+ int i ;
535
535
536
536
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "SS" , & formatarg , & formatarg_len ,
537
537
& inputarg , & inputarg_len ) == FAILURE ) {
@@ -551,8 +551,8 @@ PHP_FUNCTION(unpack)
551
551
char c ;
552
552
int arg = 1 , argb ;
553
553
char * name ;
554
- zend_str_size_int namelen ;
555
- zend_str_size_int size = 0 ;
554
+ int namelen ;
555
+ int size = 0 ;
556
556
557
557
/* Handle format arguments if any */
558
558
if (formatlen > 0 ) {
@@ -673,7 +673,7 @@ PHP_FUNCTION(unpack)
673
673
inputpos = 0 ;
674
674
}
675
675
676
- if ((inputpos + size ) <= inputlen ) {
676
+ if ((size >= 0 && ( inputpos + size ) <= inputlen ) || ( size < 0 && - size <= ( inputlen - inputpos )) ) {
677
677
switch ((int ) type ) {
678
678
case 'a' : {
679
679
/* a will not strip any trailing whitespace or null padding */
@@ -920,8 +920,10 @@ PHP_FUNCTION(unpack)
920
920
}
921
921
}
922
922
923
- formatlen -- ; /* Skip '/' separator, does no harm if inputlen == 0 */
924
- format ++ ;
923
+ if (formatlen > 0 ) {
924
+ formatlen -- ; /* Skip '/' separator, does no harm if inputlen == 0 */
925
+ format ++ ;
926
+ }
925
927
}
926
928
}
927
929
/* }}} */
0 commit comments