From 6a80918ccc1bd438d63efafafc9a25d6664586a6 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 1 Jan 2025 16:57:57 +0000 Subject: [PATCH 1/2] Fix GH-17317: ResourceBundle crash on undefined iterator key. --- .../resourcebundle/resourcebundle_iterator.c | 7 ++- ext/intl/tests/gh17317.phpt | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 ext/intl/tests/gh17317.phpt diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.c b/ext/intl/resourcebundle/resourcebundle_iterator.c index 9ec97f64f51d4..e5e5d687c2d97 100644 --- a/ext/intl/resourcebundle/resourcebundle_iterator.c +++ b/ext/intl/resourcebundle/resourcebundle_iterator.c @@ -105,7 +105,12 @@ static void resourcebundle_iterator_key( zend_object_iterator *iter, zval *key ) } if (iterator->is_table) { - ZVAL_STRING(key, iterator->currentkey); + if (EXPECTED(iterator->currentkey)) { + ZVAL_STRING(key, iterator->currentkey); + } else { + ZVAL_NULL(key); + ZVAL_NULL(&iterator->current); + } } else { ZVAL_LONG(key, iterator->i); } diff --git a/ext/intl/tests/gh17317.phpt b/ext/intl/tests/gh17317.phpt new file mode 100644 index 0000000000000..ee0aab570541b --- /dev/null +++ b/ext/intl/tests/gh17317.phpt @@ -0,0 +1,48 @@ +--TEST-- +GH-17319 (ResourceBundle iterator crash on NULL key) +--EXTENSIONS-- +intl +--CREDITS-- +KidFlo +--FILE-- +get('calendar')->get('buddhist') as $key => $value) { + echo "KEY: "; var_dump($key); + echo "VALUE: "; var_dump($value); +} +?> +--EXPECT-- +KEY: string(15) "AmPmMarkersAbbr" +VALUE: object(ResourceBundle)#3 (0) { +} +KEY: string(15) "AmPmMarkersAbbr" +VALUE: object(ResourceBundle)#4 (0) { +} +KEY: string(16) "DateTimePatterns" +VALUE: object(ResourceBundle)#3 (0) { +} +KEY: NULL +VALUE: NULL +KEY: NULL +VALUE: NULL +KEY: string(11) "appendItems" +VALUE: object(ResourceBundle)#3 (0) { +} +KEY: string(16) "availableFormats" +VALUE: object(ResourceBundle)#4 (0) { +} +KEY: string(8) "dayNames" +VALUE: object(ResourceBundle)#3 (0) { +} +KEY: string(4) "eras" +VALUE: object(ResourceBundle)#4 (0) { +} +KEY: string(15) "intervalFormats" +VALUE: object(ResourceBundle)#3 (0) { +} +KEY: string(10) "monthNames" +VALUE: object(ResourceBundle)#4 (0) { +} +KEY: string(8) "quarters" +VALUE: object(ResourceBundle)#3 (0) { +} From f7937ac9f768dfe93db8c60390f3ea8d8b6f8282 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 1 Jan 2025 23:04:21 +0000 Subject: [PATCH 2/2] set to undef --- .../resourcebundle/resourcebundle_iterator.c | 3 +-- ext/intl/tests/gh17317.phpt | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.c b/ext/intl/resourcebundle/resourcebundle_iterator.c index e5e5d687c2d97..4328cdf9680d2 100644 --- a/ext/intl/resourcebundle/resourcebundle_iterator.c +++ b/ext/intl/resourcebundle/resourcebundle_iterator.c @@ -108,8 +108,7 @@ static void resourcebundle_iterator_key( zend_object_iterator *iter, zval *key ) if (EXPECTED(iterator->currentkey)) { ZVAL_STRING(key, iterator->currentkey); } else { - ZVAL_NULL(key); - ZVAL_NULL(&iterator->current); + ZVAL_UNDEF(key); } } else { ZVAL_LONG(key, iterator->i); diff --git a/ext/intl/tests/gh17317.phpt b/ext/intl/tests/gh17317.phpt index ee0aab570541b..fa0a0c327b871 100644 --- a/ext/intl/tests/gh17317.phpt +++ b/ext/intl/tests/gh17317.phpt @@ -21,10 +21,18 @@ VALUE: object(ResourceBundle)#4 (0) { KEY: string(16) "DateTimePatterns" VALUE: object(ResourceBundle)#3 (0) { } -KEY: NULL -VALUE: NULL -KEY: NULL -VALUE: NULL +KEY: +Warning: Undefined variable $key in /home/dcarlier/Contribs/php-src/ext/intl/tests/gh17317.php on line 3 +NULL +VALUE: +Warning: Undefined variable $value in /home/dcarlier/Contribs/php-src/ext/intl/tests/gh17317.php on line 4 +NULL +KEY: +Warning: Undefined variable $key in /home/dcarlier/Contribs/php-src/ext/intl/tests/gh17317.php on line 3 +NULL +VALUE: +Warning: Undefined variable $value in /home/dcarlier/Contribs/php-src/ext/intl/tests/gh17317.php on line 4 +NULL KEY: string(11) "appendItems" VALUE: object(ResourceBundle)#3 (0) { }