]> granicus.if.org Git - php/commitdiff
Validate pattern against mbregex encoding
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 11 Feb 2019 11:10:40 +0000 (12:10 +0100)
committerStanislav Malyshev <stas@php.net>
Thu, 28 Mar 2019 06:19:46 +0000 (23:19 -0700)
Oniguruma does not consistently perform this validation itself (at least
on older versions), so make sure we check pattern encoding validity on the
PHP side.

ext/mbstring/php_mbregex.c
ext/mbstring/tests/bug72994.phpt
ext/mbstring/tests/bug77370.phpt
ext/mbstring/tests/bug77371.phpt
ext/mbstring/tests/bug77381.phpt
ext/mbstring/tests/mb_ereg_replace_variation1.phpt

index 5b40661b0957de838415b41c3e625972822512fe..ab4fe38df23fa326b9f42d3b69171423046b87a1 100644 (file)
@@ -451,13 +451,18 @@ static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patl
        OnigErrorInfo err_info;
        OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];
 
+       if (!php_mb_check_encoding(pattern, patlen, _php_mb_regex_mbctype2name(enc))) {
+               php_error_docref(NULL, E_WARNING,
+                       "Pattern is not valid under %s encoding", _php_mb_regex_mbctype2name(enc));
+               return NULL;
+       }
+
        rc = zend_hash_str_find_ptr(&MBREX(ht_rc), (char *)pattern, patlen);
        if (!rc || onig_get_options(rc) != options || onig_get_encoding(rc) != enc || onig_get_syntax(rc) != syntax) {
                if ((err_code = onig_new(&retval, (OnigUChar *)pattern, (OnigUChar *)(pattern + patlen), options, enc, syntax, &err_info)) != ONIG_NORMAL) {
                        onig_error_code_to_str(err_str, err_code, &err_info);
                        php_error_docref(NULL, E_WARNING, "mbregex compile err: %s", err_str);
-                       retval = NULL;
-                       goto out;
+                       return NULL;
                }
                if (rc == MBREX(search_re)) {
                        /* reuse the new rc? see bug #72399 */
@@ -467,7 +472,6 @@ static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patl
        } else {
                retval = rc;
        }
-out:
        return retval;
 }
 /* }}} */
index 1d37bae7be9ba1d6298fac1fa38e80daeca60cf4..d001fac6798239762db523b7cd0170f2a73b5659 100644 (file)
@@ -13,5 +13,7 @@ var_dump($var1);
 ===DONE===
 --EXPECTF--
 Notice: Undefined variable: var in %s on line %d
-string(0) ""
+
+Warning: mbereg_replace(): Pattern is not valid under UTF-8 encoding in %s on line %d
+bool(false)
 ===DONE===
index c4d25582fe3bd8c4e513ffaf59cb15ead32dc0d2..d16fcd724d93c55842481c8ed5fd9c2861e0ca8f 100644 (file)
@@ -6,8 +6,6 @@ Bug #77370 (Buffer overflow on mb regex functions - fetch_token)
 <?php
 var_dump(mb_split("   \xfd",""));
 ?>
---EXPECT--
-array(1) {
-  [0]=>
-  string(0) ""
-}
+--EXPECTF--
+Warning: mb_split(): Pattern is not valid under UTF-8 encoding in %s on line %d
+bool(false)
index 33e5fc115c966f5fff67789b2c6b34a64ed024d1..25f5ac9acac263e8295a90b444080a86b8ed3d59 100644 (file)
@@ -6,5 +6,6 @@ Bug #77371 (heap buffer overflow in mb regex functions - compile_string_node)
 <?php
 var_dump(mb_ereg("()0\xfc00000\xfc00000\xfc00000\xfc",""));
 ?>
---EXPECT--
-bool(false)
\ No newline at end of file
+--EXPECTF--
+Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
+bool(false)
index cb83759fc09b6307168177ec562d61b50d786a3a..9768cd34de2d2050086c1a9e2d0ad030d088d9be 100644 (file)
@@ -9,8 +9,15 @@ var_dump(mb_ereg("(?i)000000000000000000000\xf0",""));
 var_dump(mb_ereg("0000\\"."\xf5","0"));
 var_dump(mb_ereg("(?i)FFF00000000000000000\xfd",""));
 ?>
---EXPECT--
-int(1)
+--EXPECTF--
+Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
+
+Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
+
+Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
+bool(false)
+
+Warning: mb_ereg(): Pattern is not valid under UTF-8 encoding in %s on line %d
 bool(false)
index 059d2c9dd8f15ccae46be86faa294aae1cff72e8..626e9a20e68c563fa2aadbc2c2c29ee132df3a19 100644 (file)
@@ -109,13 +109,17 @@ string(10) "string_val"
 string(10) "string_val"
 
 -- Iteration 4 --
-string(10) "string_val"
+
+Warning: mb_ereg_replace(): Pattern is not valid under UTF-8 encoding in %s on line %d
+bool(false)
 
 -- Iteration 5 --
 string(10) "string_val"
 
 -- Iteration 6 --
-string(10) "string_val"
+
+Warning: mb_ereg_replace(): Pattern is not valid under UTF-8 encoding in %s on line %d
+bool(false)
 
 -- Iteration 7 --
 string(10) "string_val"