com php-src: added php_mb_check_code_point for mb _substitute_character: ext/mbstring/mbstring.c ext/ mbstring/tests/bug69079.phpt

From: Date: Thu, 19 Feb 2015 13:49:13 +0000
Subject: com php-src: added php_mb_check_code_point for mb _substitute_character: ext/mbstring/mbstring.c ext/ mbstring/tests/bug69079.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-96511@lists.php.net to get a copy of this message
Commit: aa7eceb3a554c6bc6f4415b3263feb333b075ea6 Author: Masaki Kagaya <masakielastic@gmail.com> Thu, 19 Feb 2015 22:49:13 +0900 Parents: f303f59813b388484764601b6fd05345e90ed450 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=aa7eceb3a554c6bc6f4415b3263feb333b075ea6 Log: added php_mb_check_code_point for mb_substitute_character Changed paths: M ext/mbstring/mbstring..c A ext/mbstring/tests/bug69079.phpt Diff: diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 7029b01..c5901cc 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -104,6 +104,7 @@ static void php_mb_gpc_get_detect_order(const zend_encoding ***list, size_t *lis static void php_mb_gpc_set_input_encoding(const zend_encoding *encoding); +static inline zend_bool php_mb_check_encoding(const char *input, size_t length, const char *enc); /* }}} */ /* {{{ php_mb_default_identify_list */ @@ -1981,6 +1982,111 @@ PHP_FUNCTION(mb_detect_order) } /* }}} */ +static inline zend_bool php_mb_check_code_point(long cp) +{ + enum mbfl_no_encoding no_enc; + const char* enc; + char* buf; + char buf_len; + + no_enc = MBSTRG(current_internal_encoding)->no_encoding; + + if (no_enc == mbfl_no_encoding_utf8 + || no_enc == mbfl_no_encoding_utf8_docomo + || no_enc == mbfl_no_encoding_utf8_kddi_a + || no_enc == mbfl_no_encoding_utf8_kddi_b + || no_enc == mbfl_no_encoding_utf8_sb + ) { + if ((cp > 0 && 0xd800 > cp) || (cp > 0xdfff && 0x110000 > cp)) { + return true; + } + + return false; + } else if (no_enc == mbfl_no_encoding_ucs4 + || no_enc == mbfl_no_encoding_ucs4be + || no_enc == mbfl_no_encoding_ucs4le + || no_enc == mbfl_no_encoding_utf32 + || no_enc == mbfl_no_encoding_utf32be + || no_enc == mbfl_no_encoding_utf32le + || no_enc == mbfl_no_encoding_ucs2 + || no_enc == mbfl_no_encoding_ucs2be + || no_enc == mbfl_no_encoding_ucs2le + || no_enc == mbfl_no_encoding_utf16 + || no_enc == mbfl_no_encoding_utf16be + || no_enc == mbfl_no_encoding_utf16le + ) { + + if (0 > cp || cp > 0x10ffff) { + return false; + } + + return true; + + } else if (no_enc == mbfl_no_encoding_pass + || no_enc == mbfl_no_encoding_auto + || no_enc == mbfl_no_encoding_wchar + || no_enc == mbfl_no_encoding_byte2be + || no_enc == mbfl_no_encoding_byte2le + || no_enc == mbfl_no_encoding_byte4be + || no_enc == mbfl_no_encoding_byte4le + || no_enc == mbfl_no_encoding_base64 + || no_enc == mbfl_no_encoding_uuencode + || no_enc == mbfl_no_encoding_html_ent + || no_enc == mbfl_no_encoding_qprint + || no_enc == mbfl_no_encoding_utf7 + || no_enc == mbfl_no_encoding_utf7imap + || no_enc == mbfl_no_encoding_2022kr + || no_enc == mbfl_no_encoding_jis + || no_enc == mbfl_no_encoding_2022jp + || no_enc == mbfl_no_encoding_2022jpms + || no_enc == mbfl_no_encoding_jis_ms + || no_enc == mbfl_no_encoding_2022jp_2004 + || no_enc == mbfl_no_encoding_2022jp_kddi + || no_enc == mbfl_no_encoding_cp50220 + || no_enc == mbfl_no_encoding_cp50220raw + || no_enc == mbfl_no_encoding_cp50221 + || no_enc == mbfl_no_encoding_cp50222 + ) { + return cp < 0xffff && cp > 0x0; + } + + if (cp < 0x100) { + buf_len = 1; + buf = emalloc(buf_len); + buf[0] = cp; + buf[1] = 0; + } else if (cp < 0x10000) { + buf_len = 2; + buf = emalloc(buf_len); + buf[0] = cp >> 8; + buf[1] = cp & 0xff; + buf[2] = 0; + } else if (cp < 0x1000000) { + buf_len = 3; + buf = emalloc(buf_len); + buf[0] = cp >> 16; + buf[1] = (cp >> 8) & 0xff; + buf[2] = cp & 0xff; + buf[3] = 0; + } else { + buf_len = 4; + buf = emalloc(buf_len); + buf[0] = cp >> 24; + buf[1] = (cp >> 16) & 0xff; + buf[2] = (cp >> 8) & 0xff; + buf[3] = cp & 0xff; + buf[4] = 0; + } + + enc = MBSTRG(current_internal_encoding)->name; + + if (php_mb_check_encoding(buf, buf_len, enc)) { + return true; + } + + return false; +} + /* {{{ proto mixed mb_substitute_character([mixed substchar]) Sets the current substitute_character or returns the current substitute_character */ PHP_FUNCTION(mb_substitute_character) @@ -2015,7 +2121,7 @@ PHP_FUNCTION(mb_substitute_character) } else { convert_to_long_ex(arg1); - if (Z_LVAL_P(arg1) < 0xffff && Z_LVAL_P(arg1) > 0x0) { + if (php_mb_check_code_point(Z_LVAL_P(arg1))) { MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR; MBSTRG(current_filter_illegal_substchar) = Z_LVAL_P(arg1); } else { @@ -2026,7 +2132,7 @@ PHP_FUNCTION(mb_substitute_character) break; default: convert_to_long_ex(arg1); - if (Z_LVAL_P(arg1) < 0xffff && Z_LVAL_P(arg1) > 0x0) { + if (php_mb_check_code_point(Z_LVAL_P(arg1))) { MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR; MBSTRG(current_filter_illegal_substchar) = Z_LVAL_P(arg1); } else { diff --git a/ext/mbstring/tests/bug69079.phpt b/ext/mbstring/tests/bug69079.phpt new file mode 100644 index 0000000..67c4d0c --- /dev/null +++ b/ext/mbstring/tests/bug69079.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #69079 (enhancement for mb_substitute_character) +--SKIPIF-- +<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> +--FILE-- +<?php +mb_internal_encoding('UTF-8'); +var_dump(mb_substitute_character(0x1f600)); +mb_internal_encoding('EUC-JP-2004'); +var_dump(mb_substitute_character(0x8fa1ef)); +?> +--EXPECT-- +bool(true) +bool(true) \ No newline at end of file

« previous php.cvs (#96511) next »