From 68e321fbfbc25dd7cdc4bd571199528c29aabcb4 Mon Sep 17 00:00:00 2001 From: Weilin Du Date: Thu, 24 Sep 2026 00:31:43 +0800 Subject: [PATCH] ext/intl: Stop enumCharNames() when the callback throws --- .../enumCharNames_callback_exception.phpt | 20 +++++++++++++++++++ ext/intl/uchar/uchar.cpp | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 ext/intl/uchar/tests/enumCharNames_callback_exception.phpt diff --git a/ext/intl/uchar/tests/enumCharNames_callback_exception.phpt b/ext/intl/uchar/tests/enumCharNames_callback_exception.phpt new file mode 100644 index 000000000000..2ebac7aac92c --- /dev/null +++ b/ext/intl/uchar/tests/enumCharNames_callback_exception.phpt @@ -0,0 +1,20 @@ +--TEST-- +IntlChar::enumCharNames() propagates callback exceptions and remains usable +--EXTENSIONS-- +intl +--FILE-- +getMessage(), "\n"; +} +var_dump(IntlChar::enumCharNames(65, 68, static fn() => false)); +?> +--EXPECT-- +65 +Stop enumeration +bool(true) diff --git a/ext/intl/uchar/uchar.cpp b/ext/intl/uchar/uchar.cpp index 1319ec679085..b2df5b9a05a8 100644 --- a/ext/intl/uchar/uchar.cpp +++ b/ext/intl/uchar/uchar.cpp @@ -312,7 +312,7 @@ static UBool enumCharNames_callback(enumCharNames_data *context, } zval_ptr_dtor(&retval); zval_ptr_dtor_str(&args[2]); - return 1; + return !EG(exception); } IC_METHOD(enumCharNames) { UChar32 start, limit;