diff options
Diffstat (limited to 'ext/intl')
-rwxr-xr-x | ext/intl/formatter/formatter_parse.c | 5 | ||||
-rwxr-xr-x | ext/intl/msgformat/msgformat.c | 4 | ||||
-rw-r--r-- | ext/intl/tests/bug59597_32.phpt | 21 | ||||
-rw-r--r-- | ext/intl/tests/bug59597_64.phpt | 21 |
4 files changed, 48 insertions, 3 deletions
diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index cbdde855de..6f3a3a12b5 100755 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -83,11 +83,10 @@ PHP_FUNCTION( numfmt_parse ) break; case FORMAT_TYPE_INT64: val64 = unum_parseInt64(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, &INTL_DATA_ERROR_CODE(nfo)); - if(val64 > LONG_MAX || val64 < -LONG_MAX) { + if(val64 > LONG_MAX || val64 < LONG_MIN) { RETVAL_DOUBLE(val64); } else { - val32 = (int32_t)val64; - RETVAL_LONG(val32); + RETVAL_LONG((long)val64); } break; case FORMAT_TYPE_DOUBLE: diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c index b31db9d6ff..84f14de1bd 100755 --- a/ext/intl/msgformat/msgformat.c +++ b/ext/intl/msgformat/msgformat.c @@ -68,6 +68,10 @@ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) INTL_CTOR_CHECK_STATUS(mfo, "msgfmt_create: error converting pattern to quote-friendly format"); } + if ((mfo)->mf_data.orig_format) { + msgformat_data_free(&mfo->mf_data TSRMLS_CC); + } + (mfo)->mf_data.orig_format = estrndup(pattern, pattern_len); (mfo)->mf_data.orig_format_len = pattern_len; diff --git a/ext/intl/tests/bug59597_32.phpt b/ext/intl/tests/bug59597_32.phpt new file mode 100644 index 0000000000..928a235a83 --- /dev/null +++ b/ext/intl/tests/bug59597_32.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer +--SKIPIF-- +<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> +<?php echo PHP_INT_SIZE == 8 ? "skip 32-bit only" : "OK"; ?> +--FILE-- +<?php + +$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL); +$value = $formatter->parse('2147483647', \NumberFormatter::TYPE_INT32); +var_dump($value); + +$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL); +$value = $formatter->parse('2147483650', \NumberFormatter::TYPE_INT64); +var_dump($value); + +?> +--EXPECT-- +int(2147483647) +float(2147483650) + diff --git a/ext/intl/tests/bug59597_64.phpt b/ext/intl/tests/bug59597_64.phpt new file mode 100644 index 0000000000..4b96bf72e9 --- /dev/null +++ b/ext/intl/tests/bug59597_64.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer +--SKIPIF-- +<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?> +<?php echo PHP_INT_SIZE != 8 ? "skip 64-bit only" : "OK"; ?> +--FILE-- +<?php + +$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL); +$value = $formatter->parse('2147483647', \NumberFormatter::TYPE_INT32); +var_dump($value); + +$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL); +$value = $formatter->parse('2147483650', \NumberFormatter::TYPE_INT64); +var_dump($value); + +?> +--EXPECTREGEX-- +int(2147483647) +int(2147483650) + |