moriyoshi Thu Jan 23 15:07:39 2003 EDT Modified files: /php4/ext/mbstring php_mbregex.c Log: Fixed a mb_ereg_replace() bug; the function was not completely multibyte-safe. Index: php4/ext/mbstring/php_mbregex.c diff -u php4/ext/mbstring/php_mbregex.c:1.30 php4/ext/mbstring/php_mbregex.c:1.31 --- php4/ext/mbstring/php_mbregex.c:1.30 Tue Jan 21 17:09:09 2003 +++ php4/ext/mbstring/php_mbregex.c Thu Jan 23 15:07:39 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_mbregex.c,v 1.30 2003/01/21 22:09:09 moriyoshi Exp $ */ +/* $Id: php_mbregex.c,v 1.31 2003/01/23 20:07:39 moriyoshi Exp $ */ #ifdef HAVE_CONFIG_H @@ -519,6 +519,17 @@ char *description = NULL; char pat_buf[2]; + const mbfl_encoding *enc; + + { + const char *current_enc_name; + current_enc_name = php_mbregex_mbctype2name(MBSTRG(current_mbctype)); + if (current_enc_name == NULL || + (enc = mbfl_name2encoding(current_enc_name)) == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error"); + RETURN_FALSE; + } + } eval = 0; { char *option_str = NULL; @@ -592,12 +603,13 @@ /* copy the part of the string before the match */ _php_mb_regex_strbuf_ncat(&outdev, (const unsigned char *)&string[pos], regs.beg[0] - pos); /* copy replacement and backrefs */ - /* FIXME: this code (\\digit replacement) is not mbyte aware! */ i = 0; p = replace; while (i < replace_len) { + int fwd = (int) php_mb_mbchar_bytes_ex(p, enc); n = -1; - if (p[0] == '\\' && p[1] >= '0' && p[1] <= '9') { + if ((replace_len - i) >= 2 && fwd == 1 && + p[0] == '\\' && p[1] >= '0' && p[1] <= '9') { n = p[1] - '0'; } if (n >= 0 && n < regs.num_regs) { @@ -608,8 +620,8 @@ i += 2; } else { _php_mb_regex_strbuf_ncat(pdevice, (const unsigned char *)p, 1); - p++; - i++; + p += fwd; + i += fwd; } } if (eval) {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php