From: Brian Shire Date: Tue, 3 Apr 2007 19:50:40 +0000 (+0000) Subject: correction for previous fix to bug #38770 (pack/unpack is broken on 64bit) X-Git-Tag: php-5.2.2RC1~63 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bd4add59f72a7f7576611a1d3d680bbf371c1e3e;p=php correction for previous fix to bug #38770 (pack/unpack is broken on 64bit) fix pack test, correct space to tabs --- diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 569266ea1a..15924dba04 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -760,7 +760,7 @@ PHP_FUNCTION(unpack) 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); add_assoc_long(return_value, n, v); @@ -775,15 +775,17 @@ PHP_FUNCTION(unpack) int *map = machine_endian_long_map; long v = 0; - if (type == 'l') { + if (type == 'l' || type == 'L') { issigned = input[inputpos + (machine_little_endian ? 3 : 0)] & 0x80; } else if (type == 'N') { + issigned = input[inputpos] & 0x80; map = big_endian_long_map; } else if (type == 'V') { + issigned = input[inputpos + 3] & 0x80; map = little_endian_long_map; } - if (sizeof(long) > 4 && (input[inputpos + machine_endian_long_map[3]] & 0x80) == 0x80) { + if (sizeof(long) > 4 && issigned) { v = ~INT_MAX; } diff --git a/ext/standard/tests/strings/pack.phpt b/ext/standard/tests/strings/pack.phpt index b36eee1e57..60b546fce6 100644 --- a/ext/standard/tests/strings/pack.phpt +++ b/ext/standard/tests/strings/pack.phpt @@ -145,7 +145,7 @@ Array ) Array ( - [1] => 0 + [1] => -1 ) Array ( @@ -185,7 +185,7 @@ Array ) Array ( - [1] => 0 + [1] => -1 ) Array ( @@ -233,7 +233,7 @@ Array ) Array ( - [1] => 0 + [1] => -1 ) Array ( @@ -305,7 +305,7 @@ Array ) Array ( - [1] => 0 + [1] => -1 ) Array (