]> granicus.if.org Git - php/commitdiff
* fixed bug #47842 sscanf() does not support 64-bit values
authorMichael Wallner <mike@php.net>
Wed, 19 May 2010 11:28:08 +0000 (11:28 +0000)
committerMichael Wallner <mike@php.net>
Wed, 19 May 2010 11:28:08 +0000 (11:28 +0000)
NEWS
ext/standard/scanf.c
ext/standard/tests/strings/bug47842.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index dc80239fa38fa5bfdbe2d229a6f04ea4d9a0453f..2303ff53a9504c533033eb9a625d8bcd685168d9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -171,6 +171,7 @@ PHP                                                                        NEWS
   parent dir). (Etienne)
 - Fixed bug #48289 (iconv_mime_encode() quoted-printable scheme is broken).
   (Adam, patch from hiroaki dot kawai at gmail dot com).
+- Fixed bug #47842 (sscanf() does not support 64-bit values). (Mike)
 - Fixed bug #46111 (Some timezone identifiers can not be parsed). (Derick)
 - Fixed bug #43233 (sasl support for ldap on Windows). (Pierre)
 - Fixed bug #35673 (formatOutput does not work with saveHTML). (Rob)
index e6b3f5865b365f9cbc8bd13bdc6ce1ca1d8374da..903fe83479ea9dad5a9f5c07e819bdb80952b7a4 100644 (file)
@@ -581,7 +581,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format,
                                int varStart, zval **return_value TSRMLS_DC)
 {
        int  numVars, nconversions, totalVars = -1;
-       int  i, value, result;
+       int  i, result;
+       long value;
        int  objIndex;
        char *end, *baseString;
        zval **current;
@@ -1059,9 +1060,9 @@ addToInt:
                                 */
                                if (!(flags & SCAN_SUPPRESS)) {
                                        *end = '\0';
-                                       value = (int) (*fn)(buf, NULL, base);
+                                       value = (long) (*fn)(buf, NULL, base);
                                        if ((flags & SCAN_UNSIGNED) && (value < 0)) {
-                                               snprintf(buf, sizeof(buf), "%u", value); /* INTL: ISO digit */
+                                               snprintf(buf, sizeof(buf), "%lu", value); /* INTL: ISO digit */
                                                if (numVars && objIndex >= argCount) {
                                                        break;
                                                } else if (numVars) {
diff --git a/ext/standard/tests/strings/bug47842.phpt b/ext/standard/tests/strings/bug47842.phpt
new file mode 100644 (file)
index 0000000..4ac9da6
--- /dev/null
@@ -0,0 +1,34 @@
+--TEST--
+Bug #47842      sscanf() does not support 64-bit values
+--SKIPIF--
+<?php
+if (PHP_INT_MAX < pow(2,31)) die("skip PHP_INT_MAX < 32b\n");
+?>
+--FILE--
+<?php
+echo "-Test\n";
+
+sscanf("2147483647", '%d', $int);
+echo "sscanf 32-bit signed int '2147483647'           (2^31)-1 = ",$int,"\n";
+sscanf("4294967295", '%u', $int);
+echo "sscanf 32-bit unsign int '4294967295'           (2^32)-1 = ",$int,"\n";
+
+sscanf("9223372036854775807", '%d', $int);
+echo "sscanf 64-bit signed int '9223372036854775807'  (2^63)-1 = ",$int,"\n";
+sscanf("18446744073709551615", '%u', $int);
+echo "sscanf 64-bit unsign int '18446744073709551615' (2^64)-1 = ",$int,"\n";
+
+printf("printf 64-bit signed int '9223372036854775807'  (2^63)-1 = %d\n", 9223372036854775807);
+printf("printf 64-bit signed int '18446744073709551615' (2^64)-1 = %u\n", 18446744073709551615);
+
+echo "Done\n";
+?>
+--EXPECTF--
+%aTest
+sscanf 32-bit signed int '2147483647'           (2^31)-1 = 2147483647
+sscanf 32-bit unsign int '4294967295'           (2^32)-1 = 4294967295
+sscanf 64-bit signed int '9223372036854775807'  (2^63)-1 = 9223372036854775807
+sscanf 64-bit unsign int '18446744073709551615' (2^64)-1 = 18446744073709551615
+printf 64-bit signed int '9223372036854775807'  (2^63)-1 = 9223372036854775807
+printf 64-bit signed int '18446744073709551615' (2^64)-1 = 0
+Done