]> granicus.if.org Git - php/commitdiff
Fixed bug #62081
authorGustavo André dos Santos Lopes <cataphract@php.net>
Wed, 23 May 2012 11:03:55 +0000 (13:03 +0200)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Wed, 23 May 2012 11:25:37 +0000 (13:25 +0200)
Constructor of IntlDateFormatter would leak if called twice.

Made calling it more than once error out before starting
using resources.

ext/intl/dateformat/dateformat.c
ext/intl/tests/bug62081.phpt [new file with mode: 0644]

index 6f7432254ce59a404a201ab16a3542e926d1b3ca..05ba19e7de8d78243f423214b9ffde7e21156f8e 100755 (executable)
@@ -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 (file)
index 0000000..7d9e2ce
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #62081: IntlDateFormatter leaks memory if called twice
+--SKIPIF--
+<?php
+if (!extension_loaded('intl'))
+       die('skip intl extension not enabled');
+--FILE--
+<?php
+ini_set('intl.error_level', E_WARNING);
+$x = new IntlDateFormatter(1,1,1,1,1);
+var_dump($x->__construct(1,1,1,1,1));
+--EXPECTF--
+Warning: IntlDateFormatter::__construct(): datefmt_create: cannot call constructor twice in %s on line %d
+NULL