From 6b554251f742a9389ca16f11f8ab618c10fde67d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 26 Aug 2020 10:16:32 +0200 Subject: [PATCH] Prevent double-construction of NumberFormatter --- ext/intl/formatter/formatter_main.c | 4 ++++ ext/intl/tests/formatter_fail.phpt | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index 80d99b3f01..8f44f33fa3 100644 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -43,6 +43,10 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len); object = return_value; FORMATTER_METHOD_FETCH_OBJECT_NO_CHECK; + if (FORMATTER_OBJECT(nfo)) { + zend_throw_error(NULL, "NumberFormatter object is already constructed"); + return FAILURE; + } /* Convert pattern (if specified) to UTF-16. */ if(pattern && pattern_len) { diff --git a/ext/intl/tests/formatter_fail.phpt b/ext/intl/tests/formatter_fail.phpt index 3201c9a82b..15981178ac 100644 --- a/ext/intl/tests/formatter_fail.phpt +++ b/ext/intl/tests/formatter_fail.phpt @@ -75,6 +75,15 @@ try { } err($fmt); +$fmt = new NumberFormatter('en_US', NumberFormatter::DECIMAL); +try { + $fmt->__construct('en_US', NumberFormatter::DECIMAL); +} catch (Error $e) { + print_exception($e); + $fmt = null; +} +err($fmt); + foreach($args as $arg) { $fmt = crt("O", $arg[0], $arg[1]); err($fmt); @@ -95,6 +104,9 @@ ArgumentCountError: numfmt_create() expects at least 2 parameters, 0 given in %s ArgumentCountError: NumberFormatter::create() expects at least 2 parameters, 0 given in %s on line %d 'U_ZERO_ERROR' +Error: NumberFormatter object is already constructed in %s on line %d +'U_ZERO_ERROR' + IntlException: Constructor failed in %s on line %d 'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR' 'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR' -- 2.40.0