From b2956e0bb326913d91bfa22e1059896c6bd7c6b9 Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Mon, 17 Aug 2026 20:40:15 -0400 Subject: [PATCH] Close the keyword UEnumeration on Locale::getKeywords failure uloc_getKeywordValue failure destroyed the result array and returned without uenum_close(). Close the enumeration on that path. The success path already closes it. Audited the other uenum_close site in this file (acceptLanguage). Closes GH-23351 --- NEWS | 2 ++ ext/intl/locale/locale_methods.c | 1 + .../tests/locale_get_keywords_failure.phpt | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 ext/intl/tests/locale_get_keywords_failure.phpt diff --git a/NEWS b/NEWS index 5607f31081b8..e56e562a4c92 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ PHP NEWS . Fixed Locale::parseLocale() reading past a trailing '-' or '_'. (iliaal, Xuyang Zhang) . Fixed grapheme_str_split() treating UBRK_DONE as a byte index. (iliaal) + . Fixed a leak in Locale::getKeywords() when a keyword value cannot be + read. (iliaal) - Opcache: . Fixed opcache.protect_memory race under ZTS. (realFlowControl) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index e3894b6f28fb..2643f4920878 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -776,6 +776,7 @@ PHP_FUNCTION( locale_get_keywords ) zend_string_efree( kw_value_str ); } zend_array_destroy(Z_ARR_P(return_value)); + uenum_close( e ); RETURN_FALSE; } diff --git a/ext/intl/tests/locale_get_keywords_failure.phpt b/ext/intl/tests/locale_get_keywords_failure.phpt new file mode 100644 index 000000000000..823da63ca541 --- /dev/null +++ b/ext/intl/tests/locale_get_keywords_failure.phpt @@ -0,0 +1,18 @@ +--TEST-- +Locale::getKeywords() closes the keyword enumeration on failure +--EXTENSIONS-- +intl +--SKIPIF-- += 59.1'); +} +?> +--FILE-- + +--EXPECT-- +bool(false) +bool(true)