diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2016-08-19 19:05:33 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2016-08-20 03:01:35 +0200 |
commit | e4a006cd3e17338677ec269a8cdb1354f38e0cad (patch) | |
tree | 721176d1be1bf783b8f9742b2c35a625932d4069 | |
parent | 9164dc11e2323b8b80c389bb13d70789799b44fc (diff) | |
download | php-git-e4a006cd3e17338677ec269a8cdb1354f38e0cad.tar.gz |
Fix #65732: grapheme_*() is not Unicode compliant on CR LF sequence
According to the Unicode specification (at least as of 5.1), CRLF sequences
are considered to be a single grapheme. We cater to that special case by
letting grapheme_ascii_check() fail. While it would be trivial to fix
grapheme_ascii_check() wrt. grapheme_strlen(), grapheme_substr() and
grapheme_strrpos() would be much harder to handle, so we accept the slight
performance penalty if CRLF is involved.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/intl/grapheme/grapheme_util.c | 2 | ||||
-rw-r--r-- | ext/intl/tests/bug65732.phpt | 19 |
3 files changed, 24 insertions, 1 deletions
@@ -12,6 +12,10 @@ PHP NEWS - IMAP: . Fixed bug #72852 (imap_mail null dereference). (Anatol) +- Intl: + . Fixed bug #65732 (grapheme_*() is not Unicode compliant on CR LF + sequence). (cmb) + - JSON: . Fixed bug #72787 (json_decode reads out of bounds). (Jakub Zelenka) diff --git a/ext/intl/grapheme/grapheme_util.c b/ext/intl/grapheme/grapheme_util.c index c752b02372..350ba66255 100644 --- a/ext/intl/grapheme/grapheme_util.c +++ b/ext/intl/grapheme/grapheme_util.c @@ -221,7 +221,7 @@ int grapheme_ascii_check(const unsigned char *day, int32_t len) { int ret_len = len; while ( len-- ) { - if ( *day++ > 0x7f ) + if ( *day++ > 0x7f || (*day == '\n' && *(day - 1) == '\r') ) return -1; } diff --git a/ext/intl/tests/bug65732.phpt b/ext/intl/tests/bug65732.phpt new file mode 100644 index 0000000000..b49f884ee4 --- /dev/null +++ b/ext/intl/tests/bug65732.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #65732 (grapheme_*() is not Unicode compliant on CR LF sequence) +--SKIPIF-- +<?php +if (!extension_loaded('intl')) die('skip intl extension not available'); +?> +--FILE-- +<?php +var_dump(grapheme_strlen("\r\n")); +var_dump(grapheme_substr(implode("\r\n", ['abc', 'def', 'ghi']), 5)); +var_dump(grapheme_strrpos("a\r\nb", 'b')); +?> +==DONE== +--EXPECT-- +int(1) +string(7) "ef +ghi" +int(2) +==DONE== |