Skip to content

Commit d9549d2

Browse files
authored
ext/gettext: reland GH-13555 but only for master. (#13602)
1 parent ec285ff commit d9549d2

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

ext/gettext/gettext.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ ZEND_GET_MODULE(php_gettext)
6262
RETURN_THROWS(); \
6363
}
6464

65+
#define PHP_DCGETTEXT_CATEGORY_CHECK(_arg_num, category) \
66+
if (category == LC_ALL) { \
67+
zend_argument_value_error(_arg_num, "cannot be LC_ALL"); \
68+
RETURN_THROWS(); \
69+
}
70+
6571
PHP_MINFO_FUNCTION(php_gettext)
6672
{
6773
php_info_print_table_start();
@@ -147,9 +153,7 @@ PHP_FUNCTION(dcgettext)
147153

148154
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain))
149155
PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid))
150-
if (category == LC_ALL) {
151-
RETURN_STR_COPY(msgid);
152-
}
156+
PHP_DCGETTEXT_CATEGORY_CHECK(3, category)
153157

154158
msgstr = dcgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid), category);
155159

@@ -264,9 +268,7 @@ PHP_FUNCTION(dcngettext)
264268
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
265269
PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len)
266270
PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len)
267-
if (category == LC_ALL) {
268-
RETURN_STRING(msgid1);
269-
}
271+
PHP_DCGETTEXT_CATEGORY_CHECK(5, category)
270272

271273
msgstr = dcngettext(domain, msgid1, msgid2, count, category);
272274

ext/gettext/tests/dcgettext_lcall.phpt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,18 @@ dcgettext with LC_ALL is undefined behavior.
44
gettext
55
--FILE--
66
<?php
7-
var_dump(dcgettext('dngettextTest', 'item', LC_ALL));
8-
var_dump(dcngettext('dngettextTest', 'item', 'item2', 1, LC_ALL));
7+
try {
8+
dcgettext('dngettextTest', 'item', LC_ALL);
9+
} catch (ValueError $e) {
10+
echo $e->getMessage() . PHP_EOL;
11+
}
12+
13+
try {
14+
dcngettext('dngettextTest', 'item', 'item2', 1, LC_ALL);
15+
} catch (ValueError $e) {
16+
echo $e->getMessage();
17+
}
918
?>
10-
--EXPECT--
11-
string(4) "item"
12-
string(4) "item"
19+
--EXPECTF--
20+
dcgettext(): Argument #3 ($category) cannot be LC_ALL
21+
dcngettext(): Argument #5 ($category) cannot be LC_ALL

0 commit comments

Comments
 (0)