diff --git a/NEWS b/NEWS index e74147772c2..24acad4ddbc 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ PHP NEWS . Fixed bug GH-12186 (segfault copying/cloning a finalized HashContext). (MaxSem) +- Intl: + . Fixed bug GH-12243 (segfault on IntlDateFormatter::construct). + (David Carlier) + - SimpleXML: . Fixed bug GH-12170 (Can't use xpath with comments in SimpleXML). (nielsdos) . Fixed bug GH-12192 (SimpleXML infinite loop when getName() is called diff --git a/ext/intl/dateformat/dateformat_create.cpp b/ext/intl/dateformat/dateformat_create.cpp index 58867746ef0..50e0bd75b7e 100644 --- a/ext/intl/dateformat/dateformat_create.cpp +++ b/ext/intl/dateformat/dateformat_create.cpp @@ -99,7 +99,11 @@ static zend_result datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_error_handlin } if (!INTL_UDATE_FMT_OK(time_type)) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: invalid time format style", 0); -return FAILURE; + return FAILURE; + } + if (date_type == UDAT_PATTERN && time_type != UDAT_PATTERN) { + intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_create: time format must be UDAT_PATTERN if date format is UDAT_PATTERN", 0); + return FAILURE; } INTL_CHECK_LOCALE_LEN_OR_FAILURE(locale_len); diff --git a/ext/intl/tests/gh12243.phpt b/ext/intl/tests/gh12243.phpt new file mode 100644 index 00000000000..80fb41032f3 --- /dev/null +++ b/ext/intl/tests/gh12243.phpt @@ -0,0 +1,24 @@ +--TEST-- +GitHub #12043 segfault with IntlDateFormatter::dateType where it equals to UDAT_PATTERN (icu 50) but +IntldateFormatter::timeType needs to be set as such. +--EXTENSIONS-- +intl +--FILE-- +getTimezone(), + ); +} catch (\IntlException $e) { + echo $e->getMessage(); +} + +--EXPECT-- +datefmt_create: time format must be UDAT_PATTERN if date format is UDAT_PATTERN: U_ILLEGAL_ARGUMENT_ERROR