iliaa Sun Nov 19 18:20:48 2006 UTC Added files: (Branch: PHP_5_2) /php-src/ext/standard/tests/strings bug38770.phpt
Modified files: /php-src NEWS /php-src/ext/standard pack.c Log: Fixed bug #38770 (unpack() broken with longs on 64 bit machines). http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.367&r2=1.2027.2.547.2.368&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.367 php-src/NEWS:1.2027.2.547.2.368 --- php-src/NEWS:1.2027.2.547.2.367 Fri Nov 17 11:40:52 2006 +++ php-src/NEWS Sun Nov 19 18:20:48 2006 @@ -74,6 +74,8 @@ (Dmitry) - Fixed bug #39090 (DirectoryFilterDots doxygen docs and example is wrong). (Marcus) +- Fixed bug #38770 (unpack() broken with longs on 64 bit machines). (Ilia, + David Soria Parra). - Fixed bug #38698 (for some keys cdbmake creates corrupted db and cdb can't read valid db). (Marcus) - Fixed bug #38680 (Added missing handling of basic types in json_decode). http://cvs.php.net/viewvc.cgi/php-src/ext/standard/pack.c?r1=1.57.2.5&r2=1.57.2.5.2.1&diff_format=u Index: php-src/ext/standard/pack.c diff -u php-src/ext/standard/pack.c:1.57.2.5 php-src/ext/standard/pack.c:1.57.2.5.2.1 --- php-src/ext/standard/pack.c:1.57.2.5 Sun Feb 26 10:49:50 2006 +++ php-src/ext/standard/pack.c Sun Nov 19 18:20:48 2006 @@ -15,7 +15,7 @@ | Author: Chris Schneider <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: pack.c,v 1.57.2.5 2006/02/26 10:49:50 helly Exp $ */ +/* $Id: pack.c,v 1.57.2.5.2.1 2006/11/19 18:20:48 iliaa Exp $ */ #include "php.h" @@ -753,14 +753,16 @@ 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; } @@ -771,7 +773,7 @@ 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; @@ -781,7 +783,11 @@ 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; } http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/bug38770.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/strings/bug38770.phpt +++ php-src/ext/standard/tests/strings/bug38770.phpt -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php