diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.c b/ext/intl/resourcebundle/resourcebundle_iterator.c index 9ec97f64f51d4..4328cdf9680d2 100644 --- a/ext/intl/resourcebundle/resourcebundle_iterator.c +++ b/ext/intl/resourcebundle/resourcebundle_iterator.c @@ -105,7 +105,11 @@ 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_UNDEF(key); + } } 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..fa0a0c327b871 --- /dev/null +++ b/ext/intl/tests/gh17317.phpt @@ -0,0 +1,56 @@ +--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: +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) { +} +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) { +}