Skip to content

Commit 6422cf6

Browse files
committed
intl extension: msgfmt_set_pattern add pattern format error informations.
1 parent b34cdc5 commit 6422cf6

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

NEWS

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ PHP NEWS
3434
. Fixed bug #81738: buffer overflow in hash_update() on long parameter.
3535
(CVE-2022-37454) (nicky at mouha dot be)
3636

37+
- Intl:
38+
. Added pattern format error infos for msgfmt_set_pattern. (David Carlier)
39+
3740
- JSON:
3841
. Added json_validate(). (Juan Morales)
3942

ext/intl/msgformat/msgformat_attr.c

+9-3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ PHP_FUNCTION( msgfmt_set_pattern )
5252
size_t value_len = 0;
5353
int32_t spattern_len = 0;
5454
UChar* spattern = NULL;
55+
UParseError spattern_error = {0};
5556
MSG_FORMAT_METHOD_INIT_VARS;
5657

5758
/* Parse parameters. */
@@ -75,12 +76,17 @@ PHP_FUNCTION( msgfmt_set_pattern )
7576
}
7677
#endif
7778

78-
/* TODO: add parse error information */
79-
umsg_applyPattern(MSG_FORMAT_OBJECT(mfo), spattern, spattern_len, NULL, &INTL_DATA_ERROR_CODE(mfo));
79+
umsg_applyPattern(MSG_FORMAT_OBJECT(mfo), spattern, spattern_len, &spattern_error, &INTL_DATA_ERROR_CODE(mfo));
8080
if (spattern) {
8181
efree(spattern);
8282
}
83-
INTL_METHOD_CHECK_STATUS(mfo, "Error setting symbol value");
83+
if (U_FAILURE(INTL_DATA_ERROR_CODE(mfo))) {
84+
char *msg;
85+
spprintf(&msg, 0, "Error setting symbol value at line %d, offset %d", spattern_error.line, spattern_error.offset);
86+
intl_errors_set_custom_msg(INTL_DATA_ERROR_P(mfo), msg, 1);
87+
efree(msg);
88+
RETURN_FALSE;
89+
}
8490

8591
if(mfo->mf_data.orig_format) {
8692
efree(mfo->mf_data.orig_format);

ext/intl/tests/msgfmt_get_set_pattern.phpt

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ function ut_main()
3535
ut_msgfmt_set_pattern($fmt, str_repeat($pattern, 10));
3636
$res_str .= "New pattern: '" . ut_msgfmt_get_pattern( $fmt ) . "'\n";
3737
$res_str .= "Formatted message: " . ut_msgfmt_format( $fmt, array(123, 456) ) . "\n";
38+
$res = ut_msgfmt_set_pattern($fmt, "{0,number} trees hosting {1,number monkeys");
39+
if ($res !== false) die("ut_msgfmt_set_pattern should fail");
40+
$res_str .= ut_msgfmt_get_error_message( $fmt ) . " (" . ut_msgfmt_get_error_code( $fmt ) . ")\n";
3841

3942

4043
return $res_str;
@@ -51,3 +54,4 @@ New pattern: '{0,number} trees hosting {1,number} monkeys'
5154
Formatted message: 123 trees hosting 456 monkeys
5255
New pattern: '{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys{0,number} trees hosting {1,number} monkeys'
5356
Formatted message: 123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys123 trees hosting 456 monkeys
57+
Error setting symbol value at line 0, offset 26: U_PATTERN_SYNTAX_ERROR (65799)

0 commit comments

Comments
 (0)