From: Gustavo André dos Santos Lopes Date: Wed, 23 May 2012 11:03:55 +0000 (+0200) Subject: Fixed bug #62081 X-Git-Tag: php-5.4.4RC2~36^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=07c0d714a59cb4d38664008a165bacafd754fac2;p=php Fixed bug #62081 Constructor of IntlDateFormatter would leak if called twice. Made calling it more than once error out before starting using resources. --- diff --git a/ext/intl/dateformat/dateformat.c b/ext/intl/dateformat/dateformat.c index 6f7432254c..05ba19e7de 100755 --- a/ext/intl/dateformat/dateformat.c +++ b/ext/intl/dateformat/dateformat.c @@ -100,6 +100,13 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS) INTL_CHECK_LOCALE_LEN_OBJ(locale_len, return_value); DATE_FORMAT_METHOD_FETCH_OBJECT; + + if (DATE_FORMAT_OBJECT(dfo) != NULL) { + intl_errors_set(INTL_DATA_ERROR_P(dfo), U_ILLEGAL_ARGUMENT_ERROR, + "datefmt_create: cannot call constructor twice", 0 TSRMLS_CC); + return; + } + /* Convert pattern (if specified) to UTF-16. */ if( pattern_str && pattern_str_len>0 ){ intl_convert_utf8_to_utf16(&svalue, &slength, pattern_str, pattern_str_len, &INTL_DATA_ERROR_CODE(dfo)); @@ -169,6 +176,8 @@ PHP_FUNCTION( datefmt_create ) */ PHP_METHOD( IntlDateFormatter, __construct ) { + /* return_value param is being changed, therefore we will always return + * NULL here */ return_value = getThis(); datefmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU); } diff --git a/ext/intl/tests/bug62081.phpt b/ext/intl/tests/bug62081.phpt new file mode 100644 index 0000000000..7d9e2cec47 --- /dev/null +++ b/ext/intl/tests/bug62081.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #62081: IntlDateFormatter leaks memory if called twice +--SKIPIF-- +__construct(1,1,1,1,1)); +--EXPECTF-- +Warning: IntlDateFormatter::__construct(): datefmt_create: cannot call constructor twice in %s on line %d +NULL