Skip to content

Commit 4006162

Browse files
committed
[intl] Record the ICU error code on Spoofchecker failures
Spoofchecker::isSuspicious(), ::areConfusable(), ::areBidiConfusable(), ::setChecks(), ::setAllowedLocales() and ::setAllowedChars() warn on U_FAILURE but never record the code, so intl_get_error_code() still reads U_ZERO_ERROR after a failed call. They now record it, which is what SPOOFCHECKER_CHECK_STATUS in spoofchecker_class.h already prescribes for this class. Closes GH-23520
1 parent 0a3fe0a commit 4006162

3 files changed

Lines changed: 26 additions & 0 deletions

File tree

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ PHP NEWS
2222
read. (iliaal)
2323
. Fixed a use-after-free when IntlRuleBasedBreakIterator is constructed
2424
from compiled rules. (iliaal)
25+
. Fixed Spoofchecker methods not recording the ICU error code when an ICU
26+
call fails. (Ilia Alshanetsky)
2527

2628
- PDO_PGSQL:
2729
. Added Pdo\Pgsql::ATTR_CHUNK_SIZE to fetch a result set in chunks of the

ext/intl/spoofchecker/spoofchecker_main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, isSuspicious)
4646
ret = intl_icu_compat_uspoof_check_utf8(co->uspoof, ZSTR_VAL(text), ZSTR_LEN(text), co->uspoofres, SPOOFCHECKER_ERROR_CODE_P(co));
4747

4848
if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
49+
intl_error_set_code(NULL, SPOOFCHECKER_ERROR_CODE(co));
4950
php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
5051

5152
if (intl_icu_compat_uspoof_check_result_mismatch(co->uspoofres, ret, &errmask, SPOOFCHECKER_ERROR_CODE_P(co))) {
@@ -83,6 +84,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, areConfusable)
8384
ret = uspoof_areConfusableUTF8(co->uspoof, ZSTR_VAL(s1), (int32_t)ZSTR_LEN(s1), ZSTR_VAL(s2), (int32_t)ZSTR_LEN(s2), SPOOFCHECKER_ERROR_CODE_P(co));
8485
}
8586
if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
87+
intl_error_set_code(NULL, SPOOFCHECKER_ERROR_CODE(co));
8688
php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
8789
RETURN_TRUE;
8890
}
@@ -109,6 +111,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setAllowedLocales)
109111
uspoof_setAllowedLocales(co->uspoof, ZSTR_VAL(locales), SPOOFCHECKER_ERROR_CODE_P(co));
110112

111113
if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
114+
intl_error_set_code(NULL, SPOOFCHECKER_ERROR_CODE(co));
112115
php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
113116
return;
114117
}
@@ -130,6 +133,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setChecks)
130133
uspoof_setChecks(co->uspoof, checks, SPOOFCHECKER_ERROR_CODE_P(co));
131134

132135
if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
136+
intl_error_set_code(NULL, SPOOFCHECKER_ERROR_CODE(co));
133137
php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
134138
}
135139
}
@@ -220,6 +224,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setAllowedChars)
220224
efree(upattern);
221225

222226
if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
227+
intl_error_set_code(NULL, SPOOFCHECKER_ERROR_CODE(co));
223228
php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
224229
}
225230
}
@@ -355,6 +360,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, areBidiConfusable)
355360
ret = uspoof_areBidiConfusableUTF8(co->uspoof, (UBiDiDirection)direction, ZSTR_VAL(s1), (int32_t)ZSTR_LEN(s1), ZSTR_VAL(s2), (int32_t)ZSTR_LEN(s2), SPOOFCHECKER_ERROR_CODE_P(co));
356361
}
357362
if (U_FAILURE(SPOOFCHECKER_ERROR_CODE(co))) {
363+
intl_error_set_code(NULL, SPOOFCHECKER_ERROR_CODE(co));
358364
php_error_docref(NULL, E_WARNING, "(%d) %s", SPOOFCHECKER_ERROR_CODE(co), u_errorName(SPOOFCHECKER_ERROR_CODE(co)));
359365
RETURN_TRUE;
360366
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Spoofchecker::setChecks() records the ICU error code
3+
--EXTENSIONS--
4+
intl
5+
--SKIPIF--
6+
<?php if (!class_exists("Spoofchecker")) print 'skip'; ?>
7+
--FILE--
8+
<?php
9+
10+
$s = new Spoofchecker();
11+
$s->setChecks(1 << 20);
12+
var_dump(intl_get_error_code(), intl_get_error_message());
13+
14+
?>
15+
--EXPECTF--
16+
Warning: Spoofchecker::setChecks(): (1) U_ILLEGAL_ARGUMENT_ERROR in %s on line %d
17+
int(1)
18+
string(24) "U_ILLEGAL_ARGUMENT_ERROR"

0 commit comments

Comments
 (0)