summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-02-03 12:29:28 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-02-03 12:29:43 +0100
commit57b9eca83da0525b4ba0533477cf24560ec7032f (patch)
treee2db4a8916f464f52109a8a0a823668bf8911a34
parent7fc06635c447d65c645cd5865606b6e18c560e8f (diff)
parentc2935499b14ee605452016ea00f3c0a94c0a1943 (diff)
downloadphp-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--NEWS3
-rw-r--r--ext/intl/formatter/formatter_format.c30
-rw-r--r--ext/intl/tests/bug79212.phpt18
3 files changed, 36 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 36348a5b05..6745647a00 100644
--- a/NEWS
+++ b/NEWS
@@ -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"