diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-02-03 12:29:28 +0100 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-02-03 12:29:43 +0100 |
commit | 57b9eca83da0525b4ba0533477cf24560ec7032f (patch) | |
tree | e2db4a8916f464f52109a8a0a823668bf8911a34 | |
parent | 7fc06635c447d65c645cd5865606b6e18c560e8f (diff) | |
parent | c2935499b14ee605452016ea00f3c0a94c0a1943 (diff) | |
download | php-git-57b9eca83da0525b4ba0533477cf24560ec7032f.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3:
Fix #79212: NumberFormatter::format() may detect wrong type
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | ext/intl/formatter/formatter_format.c | 30 | ||||
-rw-r--r-- | ext/intl/tests/bug79212.phpt | 18 |
3 files changed, 36 insertions, 15 deletions
@@ -24,6 +24,9 @@ PHP NEWS . Fixed bug #79112 (IMAP extension can't find OpenSSL libraries at configure time). (Nikita) + -Intl: + . Fixed bug #79212 (NumberFormatter::format() may detect wrong type). (cmb) + - MBString: . Fixed bug #79149 (SEGV in mb_convert_encoding with non-string encodings). (cmb) diff --git a/ext/intl/formatter/formatter_format.c b/ext/intl/formatter/formatter_format.c index 05ef6789ef..0b0c9029e6 100644 --- a/ext/intl/formatter/formatter_format.c +++ b/ext/intl/formatter/formatter_format.c @@ -53,23 +53,23 @@ PHP_FUNCTION( numfmt_format ) /* Fetch the object. */ FORMATTER_METHOD_FETCH_OBJECT; - if(type == FORMAT_TYPE_DEFAULT) { - if(Z_TYPE_P(number) == IS_STRING) { - convert_scalar_to_number_ex(number); - } - - if(Z_TYPE_P(number) == IS_LONG) { - /* take INT32 on 32-bit, int64 on 64-bit */ - type = (sizeof(zend_long) == 8)?FORMAT_TYPE_INT64:FORMAT_TYPE_INT32; - } else if(Z_TYPE_P(number) == IS_DOUBLE) { - type = FORMAT_TYPE_DOUBLE; - } else { - type = FORMAT_TYPE_INT32; - } + if(Z_TYPE_P(number) != IS_ARRAY) { + convert_scalar_to_number_ex(number); + } else { + convert_to_long(number); } - if(Z_TYPE_P(number) != IS_DOUBLE && Z_TYPE_P(number) != IS_LONG) { - convert_scalar_to_number(number ); + if(type == FORMAT_TYPE_DEFAULT) { + switch(Z_TYPE_P(number)) { + case IS_LONG: + /* take INT32 on 32-bit, int64 on 64-bit */ + type = (sizeof(zend_long) == 8)?FORMAT_TYPE_INT64:FORMAT_TYPE_INT32; + break; + case IS_DOUBLE: + type = FORMAT_TYPE_DOUBLE; + break; + EMPTY_SWITCH_DEFAULT_CASE(); + } } switch(type) { diff --git a/ext/intl/tests/bug79212.phpt b/ext/intl/tests/bug79212.phpt new file mode 100644 index 0000000000..0f7897acc4 --- /dev/null +++ b/ext/intl/tests/bug79212.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #79212 (NumberFormatter::format() may detect wrong type) +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not available'); +if (!extension_loaded('gmp')) die('skip gmp extension not available'); +?> +--FILE-- +<?php +$fmt = new NumberFormatter('en_US', NumberFormatter::PATTERN_DECIMAL); +var_dump($fmt->format(gmp_init('823749273428379492374'))); + +$fmt = new NumberFormatter('en_US', NumberFormatter::PATTERN_DECIMAL); +var_dump($fmt->format([1], NumberFormatter::TYPE_INT64)); +?> +--EXPECT-- +string(21) "823749273428379400000" +string(1) "1" |