ext/gettext: reland GH-13555 but only for master. (#13602)

This commit is contained in:
David CARLIER 2024-03-05 20:56:17 +00:00 committed by GitHub
parent ec285ff669
commit d9549d2ee2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 22 additions and 11 deletions

View file

@ -62,6 +62,12 @@ ZEND_GET_MODULE(php_gettext)
RETURN_THROWS(); \ RETURN_THROWS(); \
} }
#define PHP_DCGETTEXT_CATEGORY_CHECK(_arg_num, category) \
if (category == LC_ALL) { \
zend_argument_value_error(_arg_num, "cannot be LC_ALL"); \
RETURN_THROWS(); \
}
PHP_MINFO_FUNCTION(php_gettext) PHP_MINFO_FUNCTION(php_gettext)
{ {
php_info_print_table_start(); php_info_print_table_start();
@ -147,9 +153,7 @@ PHP_FUNCTION(dcgettext)
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain)) PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain))
PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid)) PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid))
if (category == LC_ALL) { PHP_DCGETTEXT_CATEGORY_CHECK(3, category)
RETURN_STR_COPY(msgid);
}
msgstr = dcgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid), category); msgstr = dcgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid), category);
@ -264,9 +268,7 @@ PHP_FUNCTION(dcngettext)
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len) PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len) PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len)
PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len) PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len)
if (category == LC_ALL) { PHP_DCGETTEXT_CATEGORY_CHECK(5, category)
RETURN_STRING(msgid1);
}
msgstr = dcngettext(domain, msgid1, msgid2, count, category); msgstr = dcngettext(domain, msgid1, msgid2, count, category);

View file

@ -4,9 +4,18 @@ dcgettext with LC_ALL is undefined behavior.
gettext gettext
--FILE-- --FILE--
<?php <?php
var_dump(dcgettext('dngettextTest', 'item', LC_ALL)); try {
var_dump(dcngettext('dngettextTest', 'item', 'item2', 1, LC_ALL)); dcgettext('dngettextTest', 'item', LC_ALL);
} catch (ValueError $e) {
echo $e->getMessage() . PHP_EOL;
}
try {
dcngettext('dngettextTest', 'item', 'item2', 1, LC_ALL);
} catch (ValueError $e) {
echo $e->getMessage();
}
?> ?>
--EXPECT-- --EXPECTF--
string(4) "item" dcgettext(): Argument #3 ($category) cannot be LC_ALL
string(4) "item" dcngettext(): Argument #5 ($category) cannot be LC_ALL