diff options
author | Gustavo André dos Santos Lopes <cataphract@php.net> | 2012-04-23 22:10:23 +0100 |
---|---|---|
committer | Gustavo André dos Santos Lopes <cataphract@php.net> | 2012-04-23 22:10:23 +0100 |
commit | 485638a09c23e48820e0160c26098b0ef571c533 (patch) | |
tree | 4c56e646fbc5f3b3dec7b636976f4d9d313217e7 | |
parent | 883d40667d1e71b923aa05b7a4fffc8d98ab9b5e (diff) | |
parent | 8d748e5de519867d9b6ce40e3ea28a209b07768f (diff) | |
download | php-git-485638a09c23e48820e0160c26098b0ef571c533.tar.gz |
Merge branch '5.3' into 5.4
-rw-r--r-- | ext/standard/pack.c | 6 | ||||
-rw-r--r-- | ext/standard/tests/strings/bug38770.phpt | 6 | ||||
-rw-r--r-- | ext/standard/tests/strings/bug61764.phpt | 15 |
3 files changed, 18 insertions, 9 deletions
diff --git a/ext/standard/pack.c b/ext/standard/pack.c index faf0a2b299..65a5c00cc4 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -758,16 +758,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; } diff --git a/ext/standard/tests/strings/bug38770.phpt b/ext/standard/tests/strings/bug38770.phpt index 417794cd25..1821639aca 100644 --- a/ext/standard/tests/strings/bug38770.phpt +++ b/ext/standard/tests/strings/bug38770.phpt @@ -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 diff --git a/ext/standard/tests/strings/bug61764.phpt b/ext/standard/tests/strings/bug61764.phpt new file mode 100644 index 0000000000..dc44f25b3f --- /dev/null +++ b/ext/standard/tests/strings/bug61764.phpt @@ -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 +) |