summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo André dos Santos Lopes <cataphract@php.net>2012-05-23 15:52:47 +0200
committerGustavo André dos Santos Lopes <cataphract@php.net>2012-05-23 15:52:47 +0200
commitca515e807319cafb5ad5c7384422583fb633aa57 (patch)
tree0245ede4454f40af3484de5d6194f6fc6eb58dbb
parent70e3e627fe63e831135d5526372da446ef251525 (diff)
parent0838a2b7c559442aac4692a023d044f34c60d24f (diff)
downloadphp-git-ca515e807319cafb5ad5c7384422583fb633aa57.tar.gz
Merge branch '5.4'
-rwxr-xr-xext/intl/dateformat/dateformat.c64
-rw-r--r--ext/intl/tests/bug62017.phpt22
2 files changed, 67 insertions, 19 deletions
diff --git a/ext/intl/dateformat/dateformat.c b/ext/intl/dateformat/dateformat.c
index 05ba19e7de..6c0c52257b 100755
--- a/ext/intl/dateformat/dateformat.c
+++ b/ext/intl/dateformat/dateformat.c
@@ -109,14 +109,27 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
/* 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));
- INTL_CTOR_CHECK_STATUS(dfo, "datefmt_create: error converting pattern to UTF-16");
+ intl_convert_utf8_to_utf16(&svalue, &slength,
+ pattern_str, pattern_str_len, &INTL_DATA_ERROR_CODE(dfo));
+ if (U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
+ /* object construction -> only set global error */
+ intl_error_set(NULL, INTL_DATA_ERROR_CODE(dfo), "datefmt_create: "
+ "error converting pattern to UTF-16", 0 TSRMLS_CC);
+ goto error;
+ }
}
+
+ /* resources allocated from now on */
/* Convert pattern (if specified) to UTF-16. */
if( timezone_str && timezone_str_len >0 ){
- intl_convert_utf8_to_utf16(&timezone_utf16, &timezone_utf16_len, timezone_str, timezone_str_len, &INTL_DATA_ERROR_CODE(dfo));
- INTL_CTOR_CHECK_STATUS(dfo, "datefmt_create: error converting timezone_str to UTF-16" );
+ intl_convert_utf8_to_utf16(&timezone_utf16, &timezone_utf16_len,
+ timezone_str, timezone_str_len, &INTL_DATA_ERROR_CODE(dfo));
+ if (U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
+ intl_error_set(NULL, INTL_DATA_ERROR_CODE(dfo), "datefmt_create: "
+ "error converting timezone_str to UTF-16", 0 TSRMLS_CC);
+ goto error;
+ }
}
if(locale_len == 0) {
@@ -130,24 +143,24 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
}
/* Set the calendar if passed */
- if(!U_FAILURE(INTL_DATA_ERROR_CODE(dfo)) && calendar) {
- ucal_obj = ucal_open( timezone_utf16, timezone_utf16_len, locale, calendar, &INTL_DATA_ERROR_CODE(dfo) );
- if(!U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
- udat_setCalendar( DATE_FORMAT_OBJECT(dfo), ucal_obj );
+ if(!U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
+ if (calendar) {
+ ucal_obj = ucal_open(timezone_utf16, timezone_utf16_len, locale,
+ calendar, &INTL_DATA_ERROR_CODE(dfo));
+ if (!U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
+ udat_setCalendar( DATE_FORMAT_OBJECT(dfo), ucal_obj );
+ } else {
+ intl_error_set(NULL, INTL_DATA_ERROR_CODE(dfo), "datefmt_create"
+ ": error opening calendar", 0 TSRMLS_CC);
+ goto error;
+ }
}
- }
-
- if(svalue)
- {
- efree(svalue);
- }
- if(timezone_utf16)
- {
- efree(timezone_utf16);
+ } else {
+ intl_error_set(NULL, INTL_DATA_ERROR_CODE(dfo), "datefmt_create: date "
+ "formatter creation failed", 0 TSRMLS_CC);
+ goto error;
}
- INTL_CTOR_CHECK_STATUS(dfo, "datefmt_create: date formatter creation failed");
-
/* Set the class variables */
dfo->date_type = date_type;
dfo->time_type = time_type;
@@ -155,6 +168,19 @@ static void datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS)
if( timezone_str && timezone_str_len > 0){
dfo->timezone_id = estrndup( timezone_str, timezone_str_len);
}
+
+error:
+ if (svalue) {
+ efree(svalue);
+ }
+ if (timezone_utf16) {
+ efree(timezone_utf16);
+ }
+ if (U_FAILURE(intl_error_get_code(NULL TSRMLS_CC))) {
+ /* free_object handles partially constructed instances fine */
+ zval_dtor(return_value);
+ RETVAL_NULL();
+ }
}
/* }}} */
diff --git a/ext/intl/tests/bug62017.phpt b/ext/intl/tests/bug62017.phpt
new file mode 100644
index 0000000000..13c4fe5df0
--- /dev/null
+++ b/ext/intl/tests/bug62017.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #62017: datefmt_create with incorrectly encoded timezone leaks pattern
+--SKIPIF--
+<?php
+if (!extension_loaded('intl'))
+ die('skip intl extension not enabled');
+--FILE--
+<?php
+ini_set('intl.error_level', E_WARNING);
+var_dump(
+ datefmt_create('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "\xFF",
+ IntlDateFormatter::GREGORIAN, 'a'));
+var_dump(
+ new IntlDateFormatter('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "Europe/Lisbon",
+ IntlDateFormatter::GREGORIAN, "\x80"));
+--EXPECTF--
+Warning: datefmt_create(): datefmt_create: error converting timezone_str to UTF-16 in %s on line %d
+NULL
+
+Warning: IntlDateFormatter::__construct(): datefmt_create: error converting pattern to UTF-16 in %s on line %d
+NULL
+