Commit:    07c0d714a59cb4d38664008a165bacafd754fac2
Author:    Gustavo André dos Santos Lopes <cataphr...@php.net>         Wed, 23 
May 2012 13:03:55 +0200
Parents:   51286bd8e5a7acd75326fae497313725e4acf234
Branches:  PHP-5.3 PHP-5.4 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=07c0d714a59cb4d38664008a165bacafd754fac2

Log:
Fixed bug #62081

Constructor of IntlDateFormatter would leak if called twice.

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

Bugs:
https://bugs.php.net/62081

Changed paths:
  M  ext/intl/dateformat/dateformat.c
  A  ext/intl/tests/bug62081.phpt


Diff:
diff --git a/ext/intl/dateformat/dateformat.c b/ext/intl/dateformat/dateformat.c
index 6f74322..05ba19e 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 0000000..7d9e2ce
--- /dev/null
+++ b/ext/intl/tests/bug62081.phpt
@@ -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


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to