Merge branch '5.4'

This commit is contained in:
Gustavo André dos Santos Lopes 2012-04-23 22:10:50 +01:00
commit d77cde46e1
3 changed files with 18 additions and 9 deletions

View File

@ -815,16 +815,14 @@ PHP_FUNCTION(unpack)
case 'i':
case 'I': {
long v = 0;
long v;
int issigned = 0;
if (type == 'i') {
issigned = input[inputpos + (machine_little_endian ? (sizeof(int) - 1) : 0)] & 0x80;
} else if (sizeof(long) > 4 && (input[inputpos + machine_endian_long_map[3]] & 0x80) == 0x80) {
v = ~INT_MAX;
}
v |= php_unpack(&input[inputpos], sizeof(int), issigned, int_map);
v = php_unpack(&input[inputpos], sizeof(int), issigned, int_map);
add_assoc_long(return_value, n, v);
break;
}

View File

@ -7,7 +7,7 @@ if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
foreach (array('N','I','l') as $v) {
foreach (array('N','l') as $v) {
print_r(unpack($v, pack($v, -30000)));
}
@ -22,8 +22,4 @@ Array
(
[1] => -30000
)
Array
(
[1] => -30000
)
Done

View File

@ -0,0 +1,15 @@
--TEST--
Bug #61764: 'I' unpacks n as signed if n > 2^31-1 on LP64
--SKIPIF--
<?php
if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
--FILE--
<?php
//expected -30000 mod 2^32 = 4294937296, and not -30000
//because we can represent 4294937296 with our PHP int type
print_r(unpack('I', pack('L', -30000)));
--EXPECT--
Array
(
[1] => 4294937296
)