mirror of
https://github.com/php/php-src.git
synced 2024-09-24 03:17:26 +00:00
MFB: Fixed bug #38770 (unpack() broken with longs on 64 bit machines).
This commit is contained in:
parent
cdd3e8be92
commit
316e7a5b2d
@ -752,14 +752,16 @@ PHP_FUNCTION(unpack)
|
||||
|
||||
case 'i':
|
||||
case 'I': {
|
||||
long v;
|
||||
long v = 0;
|
||||
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;
|
||||
}
|
||||
@ -770,7 +772,7 @@ PHP_FUNCTION(unpack)
|
||||
case 'V': {
|
||||
int issigned = 0;
|
||||
int *map = machine_endian_long_map;
|
||||
long v;
|
||||
long v = 0;
|
||||
|
||||
if (type == 'l') {
|
||||
issigned = input[inputpos + (machine_little_endian ? 3 : 0)] & 0x80;
|
||||
@ -780,7 +782,11 @@ PHP_FUNCTION(unpack)
|
||||
map = little_endian_long_map;
|
||||
}
|
||||
|
||||
v = php_unpack(&input[inputpos], 4, issigned, map);
|
||||
if (sizeof(long) > 4 && (input[inputpos + machine_endian_long_map[3]] & 0x80) == 0x80) {
|
||||
v = ~INT_MAX;
|
||||
}
|
||||
|
||||
v |= php_unpack(&input[inputpos], 4, issigned, map);
|
||||
add_assoc_long(return_value, n, v);
|
||||
break;
|
||||
}
|
||||
|
25
ext/standard/tests/strings/bug38770.phpt
Normal file
25
ext/standard/tests/strings/bug38770.phpt
Normal file
@ -0,0 +1,25 @@
|
||||
--TEST--
|
||||
Bug #38770 (unpack() broken with longs on 64 bit machines)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
foreach (array('N','I','l') as $v) {
|
||||
print_r(unpack($v, pack($v, -30000)));
|
||||
}
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
Array
|
||||
(
|
||||
[1] => -30000
|
||||
)
|
||||
Array
|
||||
(
|
||||
[1] => -30000
|
||||
)
|
||||
Array
|
||||
(
|
||||
[1] => -30000
|
||||
)
|
||||
Done
|
Loading…
Reference in New Issue
Block a user