diff options
author | Anatol Belski <ab@php.net> | 2017-11-21 20:11:21 +0100 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2017-11-21 20:11:21 +0100 |
commit | f6b0d365a709ae71cd9f77b25c337a6e6883f68d (patch) | |
tree | a5647801ccd95876c8c2ef3a143870906fe3a56e | |
parent | 307e15592b31d65047aa04ba7892193a22ff4f94 (diff) | |
parent | f5c0754f6e235c54ccee03c520969ee75723c83d (diff) | |
download | php-git-f6b0d365a709ae71cd9f77b25c337a6e6883f68d.tar.gz |
Merge branch 'PHP-7.1' into PHP-7.2
* PHP-7.1:
Fixed #75539 and #74183 - preg_last_error not returning error code after error
-rw-r--r-- | ext/pcre/php_pcre.c | 8 | ||||
-rw-r--r-- | ext/pcre/tests/bug74183.phpt | 15 | ||||
-rw-r--r-- | ext/pcre/tests/bug75539.phpt | 13 |
3 files changed, 36 insertions, 0 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 54fd90f382..aa2695ea2c 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -362,6 +362,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) #endif php_error_docref(NULL, E_WARNING, p < ZSTR_VAL(regex) + ZSTR_LEN(regex) ? "Null byte in regex" : "Empty regular expression"); + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); return NULL; } @@ -375,6 +376,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } #endif php_error_docref(NULL,E_WARNING, "Delimiter must not be alphanumeric or backslash"); + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); return NULL; } @@ -425,6 +427,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } else { php_error_docref(NULL,E_WARNING, "No ending matching delimiter '%c' found", delimiter); } + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); return NULL; } @@ -473,6 +476,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } else { php_error_docref(NULL,E_WARNING, "Null byte in regex"); } + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); efree(pattern); #if HAVE_SETLOCALE if (key != regex) { @@ -503,6 +507,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } #endif php_error_docref(NULL,E_WARNING, "Compilation failed: %s at offset %d", error, erroffset); + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); efree(pattern); if (tables) { pefree((void*)tables, 1); @@ -534,6 +539,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } if (error != NULL) { php_error_docref(NULL, E_WARNING, "Error while studying pattern"); + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); } } else { extra = NULL; @@ -569,6 +575,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } #endif php_error_docref(NULL, E_WARNING, "Internal pcre_fullinfo() error %d", rc); + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); return NULL; } @@ -580,6 +587,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex) } #endif php_error_docref(NULL, E_WARNING, "Internal pcre_fullinfo() error %d", rc); + pcre_handle_exec_error(PCRE_ERROR_INTERNAL); return NULL; } diff --git a/ext/pcre/tests/bug74183.phpt b/ext/pcre/tests/bug74183.phpt new file mode 100644 index 0000000000..a230145961 --- /dev/null +++ b/ext/pcre/tests/bug74183.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #74183 - preg_last_error not returning error code after error +--FILE-- +<?php + +$sRegex = "/([A-Z]|[a-z]|[0-9]| |Ñ|ñ|!|"|%|&|'|´|-|:|;|>|=|<|@|_|,|\{|\}|`|~|á|é|í|ó|ú|Á|É|Í|Ó|Ú|ü|Ü){1,300}/"; +$sTest = "Hello world"; + +var_dump(preg_match($sRegex, $sTest)); +var_dump(preg_last_error() === \PREG_INTERNAL_ERROR); +?> +--EXPECTF-- +Warning: preg_match(): Compilation failed: regular expression is too large at offset %s in %s on line %s +bool(false) +bool(true)
\ No newline at end of file diff --git a/ext/pcre/tests/bug75539.phpt b/ext/pcre/tests/bug75539.phpt new file mode 100644 index 0000000000..83f3ef7d6b --- /dev/null +++ b/ext/pcre/tests/bug75539.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #75539 - Recursive call errors are not reported by preg_last_error() +--FILE-- +<?php + +var_dump(preg_match('/((?1)?z)/', '')); +var_dump(preg_last_error() === \PREG_INTERNAL_ERROR); + +?> +--EXPECTF-- +Warning: preg_match(): Compilation failed: recursive call could loop indefinitely at offset %s in %s on line %s +bool(false) +bool(true)
\ No newline at end of file |