Skip to content

Commit 26137e2

Browse files
committed
Promote warnings to exceptions in ext/gettext, ext/sysvmsg and ext/xml
1 parent 79981a3 commit 26137e2

17 files changed

+218
-160
lines changed

ext/gettext/gettext.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ ZEND_GET_MODULE(php_gettext)
4949
#define PHP_GETTEXT_MAX_DOMAIN_LENGTH 1024
5050
#define PHP_GETTEXT_MAX_MSGID_LENGTH 4096
5151

52-
#define PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) \
52+
#define PHP_GETTEXT_DOMAIN_LENGTH_CHECK(_arg_num, domain_len) \
5353
if (UNEXPECTED(domain_len > PHP_GETTEXT_MAX_DOMAIN_LENGTH)) { \
54-
php_error_docref(NULL, E_WARNING, "Domain passed too long"); \
55-
RETURN_FALSE; \
54+
zend_argument_value_error(_arg_num, "is too long"); \
55+
RETURN_THROWS(); \
5656
}
5757

58-
#define PHP_GETTEXT_LENGTH_CHECK(check_name, check_len) \
58+
#define PHP_GETTEXT_LENGTH_CHECK(_arg_num, check_len) \
5959
if (UNEXPECTED(check_len > PHP_GETTEXT_MAX_MSGID_LENGTH)) { \
60-
php_error_docref(NULL, E_WARNING, "%s passed too long", check_name); \
61-
RETURN_FALSE; \
60+
zend_argument_value_error(_arg_num, "is too long"); \
61+
RETURN_THROWS(); \
6262
}
6363

6464
PHP_MINFO_FUNCTION(php_gettext)
@@ -78,7 +78,7 @@ PHP_FUNCTION(textdomain)
7878
RETURN_THROWS();
7979
}
8080

81-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
81+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(2, domain_len)
8282

8383
if (domain != NULL && strcmp(domain, "") && strcmp(domain, "0")) {
8484
domain_name = domain;
@@ -102,7 +102,7 @@ PHP_FUNCTION(gettext)
102102
Z_PARAM_STR(msgid)
103103
ZEND_PARSE_PARAMETERS_END();
104104

105-
PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid))
105+
PHP_GETTEXT_LENGTH_CHECK(1, ZSTR_LEN(msgid))
106106
msgstr = gettext(ZSTR_VAL(msgid));
107107

108108
if (msgstr != ZSTR_VAL(msgid)) {
@@ -123,8 +123,8 @@ PHP_FUNCTION(dgettext)
123123
RETURN_THROWS();
124124
}
125125

126-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(ZSTR_LEN(domain))
127-
PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid))
126+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain))
127+
PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid))
128128

129129
msgstr = dgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid));
130130

@@ -147,8 +147,8 @@ PHP_FUNCTION(dcgettext)
147147
RETURN_THROWS();
148148
}
149149

150-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(ZSTR_LEN(domain))
151-
PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid))
150+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, ZSTR_LEN(domain))
151+
PHP_GETTEXT_LENGTH_CHECK(2, ZSTR_LEN(msgid))
152152

153153
msgstr = dcgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid), category);
154154

@@ -171,11 +171,11 @@ PHP_FUNCTION(bindtextdomain)
171171
RETURN_THROWS();
172172
}
173173

174-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
174+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
175175

176176
if (domain[0] == '\0') {
177-
php_error(E_WARNING, "The first parameter of bindtextdomain must not be empty");
178-
RETURN_FALSE;
177+
zend_argument_value_error(1, "cannot be empty");
178+
RETURN_THROWS();
179179
}
180180

181181
if (dir[0] != '\0' && strcmp(dir, "0")) {
@@ -204,8 +204,8 @@ PHP_FUNCTION(ngettext)
204204
RETURN_THROWS();
205205
}
206206

207-
PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
208-
PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
207+
PHP_GETTEXT_LENGTH_CHECK(1, msgid1_len)
208+
PHP_GETTEXT_LENGTH_CHECK(2, msgid2_len)
209209

210210
msgstr = ngettext(msgid1, msgid2, count);
211211

@@ -228,9 +228,9 @@ PHP_FUNCTION(dngettext)
228228
RETURN_THROWS();
229229
}
230230

231-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
232-
PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
233-
PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
231+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
232+
PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len)
233+
PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len)
234234

235235
msgstr = dngettext(domain, msgid1, msgid2, count);
236236

@@ -255,9 +255,9 @@ PHP_FUNCTION(dcngettext)
255255
RETURN_THROWS();
256256
}
257257

258-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
259-
PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len)
260-
PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len)
258+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
259+
PHP_GETTEXT_LENGTH_CHECK(2, msgid1_len)
260+
PHP_GETTEXT_LENGTH_CHECK(3, msgid2_len)
261261

262262
msgstr = dcngettext(domain, msgid1, msgid2, count, category);
263263

@@ -279,7 +279,7 @@ PHP_FUNCTION(bind_textdomain_codeset)
279279
RETURN_THROWS();
280280
}
281281

282-
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len)
282+
PHP_GETTEXT_DOMAIN_LENGTH_CHECK(1, domain_len)
283283

284284
retval = bind_textdomain_codeset(domain, codeset);
285285

ext/gettext/gettext.stub.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@
22

33
/** @generate-function-entries */
44

5-
function textdomain(?string $domain): string|false {}
5+
function textdomain(?string $domain): string {}
66

7-
function gettext(string $msgid): string|false {}
7+
function gettext(string $msgid): string {}
88

99
/** @alias gettext */
10-
function _(string $msgid): string|false {}
10+
function _(string $msgid): string {}
1111

12-
function dgettext(string $domain_name, string $msgid): string|false {}
12+
function dgettext(string $domain, string $msgid): string {}
1313

14-
function dcgettext(string $domain_name, string $msgid, int $category): string|false {}
14+
function dcgettext(string $domain, string $msgid, int $category): string {}
1515

16-
function bindtextdomain(string $domain_name, string $dir): string|false {}
16+
function bindtextdomain(string $domain, string $dir): string|false {}
1717

1818
#ifdef HAVE_NGETTEXT
19-
function ngettext(string $msgid1, string $msgid2, int $n): string|false {}
19+
function ngettext(string $msgid1, string $msgid2, int $n): string {}
2020
#endif
2121

2222
#ifdef HAVE_DNGETTEXT
23-
function dngettext(string $domain, string $msgid1, string $msgid2, int $count): string|false {}
23+
function dngettext(string $domain, string $msgid1, string $msgid2, int $count): string {}
2424
#endif
2525

2626
#ifdef HAVE_DCNGETTEXT
27-
function dcngettext(string $domain, string $msgid1, string $msgid2, int $count, int $category): string|false {}
27+
function dcngettext(string $domain, string $msgid1, string $msgid2, int $count, int $category): string {}
2828
#endif
2929

3030
#ifdef HAVE_BIND_TEXTDOMAIN_CODESET

ext/gettext/gettext_arginfo.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,42 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 29c84ba2a2aa940baec3bd32503fc7c8e67885fe */
2+
* Stub hash: a8b64ae24724f0552a62cd4146f6cfb3cd75fa19 */
33

4-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_textdomain, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
4+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_textdomain, 0, 1, IS_STRING, 0)
55
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 1)
66
ZEND_END_ARG_INFO()
77

8-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gettext, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
8+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettext, 0, 1, IS_STRING, 0)
99
ZEND_ARG_TYPE_INFO(0, msgid, IS_STRING, 0)
1010
ZEND_END_ARG_INFO()
1111

1212
#define arginfo__ arginfo_gettext
1313

14-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dgettext, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
15-
ZEND_ARG_TYPE_INFO(0, domain_name, IS_STRING, 0)
14+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dgettext, 0, 2, IS_STRING, 0)
15+
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
1616
ZEND_ARG_TYPE_INFO(0, msgid, IS_STRING, 0)
1717
ZEND_END_ARG_INFO()
1818

19-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dcgettext, 0, 3, MAY_BE_STRING|MAY_BE_FALSE)
20-
ZEND_ARG_TYPE_INFO(0, domain_name, IS_STRING, 0)
19+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dcgettext, 0, 3, IS_STRING, 0)
20+
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
2121
ZEND_ARG_TYPE_INFO(0, msgid, IS_STRING, 0)
2222
ZEND_ARG_TYPE_INFO(0, category, IS_LONG, 0)
2323
ZEND_END_ARG_INFO()
2424

2525
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_bindtextdomain, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
26-
ZEND_ARG_TYPE_INFO(0, domain_name, IS_STRING, 0)
26+
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
2727
ZEND_ARG_TYPE_INFO(0, dir, IS_STRING, 0)
2828
ZEND_END_ARG_INFO()
2929

3030
#if defined(HAVE_NGETTEXT)
31-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ngettext, 0, 3, MAY_BE_STRING|MAY_BE_FALSE)
31+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ngettext, 0, 3, IS_STRING, 0)
3232
ZEND_ARG_TYPE_INFO(0, msgid1, IS_STRING, 0)
3333
ZEND_ARG_TYPE_INFO(0, msgid2, IS_STRING, 0)
3434
ZEND_ARG_TYPE_INFO(0, n, IS_LONG, 0)
3535
ZEND_END_ARG_INFO()
3636
#endif
3737

3838
#if defined(HAVE_DNGETTEXT)
39-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dngettext, 0, 4, MAY_BE_STRING|MAY_BE_FALSE)
39+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dngettext, 0, 4, IS_STRING, 0)
4040
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
4141
ZEND_ARG_TYPE_INFO(0, msgid1, IS_STRING, 0)
4242
ZEND_ARG_TYPE_INFO(0, msgid2, IS_STRING, 0)
@@ -45,7 +45,7 @@ ZEND_END_ARG_INFO()
4545
#endif
4646

4747
#if defined(HAVE_DCNGETTEXT)
48-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dcngettext, 0, 5, MAY_BE_STRING|MAY_BE_FALSE)
48+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dcngettext, 0, 5, IS_STRING, 0)
4949
ZEND_ARG_TYPE_INFO(0, domain, IS_STRING, 0)
5050
ZEND_ARG_TYPE_INFO(0, msgid1, IS_STRING, 0)
5151
ZEND_ARG_TYPE_INFO(0, msgid2, IS_STRING, 0)

ext/gettext/tests/44938.phpt

Lines changed: 92 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,71 +12,110 @@ $msgid = "msgid";
1212
$domain = "domain";
1313
$category = "cat";
1414

15-
var_dump(bindtextdomain($overflown, 'path'));
16-
17-
var_dump(dngettext($overflown, $msgid, $msgid, 1));
18-
var_dump(dngettext($domain, $overflown, $msgid, 1));
19-
var_dump(dngettext($domain, $msgid, $overflown, 1));
20-
21-
var_dump(gettext($overflown));
22-
23-
var_dump(ngettext($overflown, $msgid, -1));
24-
var_dump(ngettext($msgid, $overflown, -1));
25-
26-
var_dump(dcgettext($overflown, $msgid, -1));
27-
var_dump(dcgettext($domain, $overflown, -1));
28-
29-
var_dump(dcngettext($overflown, $msgid, $msgid, -1, -1));
30-
var_dump(dcngettext($domain, $overflown, $msgid, -1, -1));
31-
var_dump(dcngettext($domain, $msgid, $overflown, -1, -1));
32-
33-
var_dump(dgettext($overflown, $msgid));
34-
var_dump(dgettext($domain, $overflown));
15+
try {
16+
bindtextdomain($overflown, 'path');
17+
} catch (ValueError $exception) {
18+
echo $exception->getMessage() . "\n";
19+
}
3520

36-
var_dump(textdomain($overflown));
37-
?>
38-
--EXPECTF--
39-
Warning: bindtextdomain(): Domain passed too long in %s on line %d
40-
bool(false)
21+
try {
22+
dngettext($overflown, $msgid, $msgid, 1);
23+
} catch (ValueError $exception) {
24+
echo $exception->getMessage() . "\n";
25+
}
4126

42-
Warning: dngettext(): Domain passed too long in %s on line %d
43-
bool(false)
27+
try {
28+
dngettext($domain, $overflown, $msgid, 1);
29+
} catch (ValueError $exception) {
30+
echo $exception->getMessage() . "\n";
31+
}
4432

45-
Warning: dngettext(): msgid1 passed too long in %s on line %d
46-
bool(false)
33+
try {
34+
dngettext($domain, $msgid, $overflown, 1);
35+
} catch (ValueError $exception) {
36+
echo $exception->getMessage() . "\n";
37+
}
4738

48-
Warning: dngettext(): msgid2 passed too long in %s on line %d
49-
bool(false)
39+
try {
40+
gettext($overflown);
41+
} catch (ValueError $exception) {
42+
echo $exception->getMessage() . "\n";
43+
}
5044

51-
Warning: gettext(): msgid passed too long in %s on line %d
52-
bool(false)
45+
try {
46+
ngettext($overflown, $msgid, -1);
47+
} catch (ValueError $exception) {
48+
echo $exception->getMessage() . "\n";
49+
}
5350

54-
Warning: ngettext(): msgid1 passed too long in %s on line %d
55-
bool(false)
51+
try {
52+
ngettext($msgid, $overflown, -1);
53+
} catch (ValueError $exception) {
54+
echo $exception->getMessage() . "\n";
55+
}
5656

57-
Warning: ngettext(): msgid2 passed too long in %s on line %d
58-
bool(false)
57+
try {
58+
dcgettext($overflown, $msgid, -1);
59+
} catch (ValueError $exception) {
60+
echo $exception->getMessage() . "\n";
61+
}
5962

60-
Warning: dcgettext(): Domain passed too long in %s on line %d
61-
bool(false)
63+
try {
64+
dcgettext($domain, $overflown, -1);
65+
} catch (ValueError $exception) {
66+
echo $exception->getMessage() . "\n";
67+
}
6268

63-
Warning: dcgettext(): msgid passed too long in %s on line %d
64-
bool(false)
69+
try {
70+
dcngettext($overflown, $msgid, $msgid, -1, -1);
71+
} catch (ValueError $exception) {
72+
echo $exception->getMessage() . "\n";
73+
}
6574

66-
Warning: dcngettext(): Domain passed too long in %s on line %d
67-
bool(false)
75+
try {
76+
dcngettext($domain, $overflown, $msgid, -1, -1);
77+
} catch (ValueError $exception) {
78+
echo $exception->getMessage() . "\n";
79+
}
6880

69-
Warning: dcngettext(): msgid1 passed too long in %s on line %d
70-
bool(false)
81+
try {
82+
dcngettext($domain, $msgid, $overflown, -1, -1);
83+
} catch (ValueError $exception) {
84+
echo $exception->getMessage() . "\n";
85+
}
7186

72-
Warning: dcngettext(): msgid2 passed too long in %s on line %d
73-
bool(false)
87+
try {
88+
dgettext($overflown, $msgid);
89+
} catch (ValueError $exception) {
90+
echo $exception->getMessage() . "\n";
91+
}
7492

75-
Warning: dgettext(): Domain passed too long in %s on line %d
76-
bool(false)
93+
try {
94+
dgettext($domain, $overflown);
95+
} catch (ValueError $exception) {
96+
echo $exception->getMessage() . "\n";
97+
}
7798

78-
Warning: dgettext(): msgid passed too long in %s on line %d
79-
bool(false)
99+
try {
100+
textdomain($overflown);
101+
} catch (ValueError $exception) {
102+
echo $exception->getMessage() . "\n";
103+
}
80104

81-
Warning: textdomain(): Domain passed too long in %s on line %d
82-
bool(false)
105+
?>
106+
--EXPECT--
107+
bindtextdomain(): Argument #1 ($domain) is too long
108+
dngettext(): Argument #1 ($domain) is too long
109+
dngettext(): Argument #2 ($msgid1) is too long
110+
dngettext(): Argument #3 ($msgid2) is too long
111+
gettext(): Argument #1 ($msgid) is too long
112+
ngettext(): Argument #1 ($msgid1) is too long
113+
ngettext(): Argument #2 ($msgid2) is too long
114+
dcgettext(): Argument #1 ($domain) is too long
115+
dcgettext(): Argument #2 ($msgid) is too long
116+
dcngettext(): Argument #1 ($domain) is too long
117+
dcngettext(): Argument #2 ($msgid1) is too long
118+
dcngettext(): Argument #3 ($msgid2) is too long
119+
dgettext(): Argument #1 ($domain) is too long
120+
dgettext(): Argument #2 ($msgid) is too long
121+
textdomain(): Argument #2 is too long

0 commit comments

Comments
 (0)