Skip to content

Commit c0d890e

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix #74604: Out of bounds in php_pcre_replace_impl
2 parents 1b36555 + 60717fc commit c0d890e

File tree

2 files changed

+5
-4
lines changed

2 files changed

+5
-4
lines changed

Zend/zend_string.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ END_EXTERN_C()
8989

9090
#define _ZSTR_STRUCT_SIZE(len) (_ZSTR_HEADER_SIZE + len + 1)
9191

92-
#define ZSTR_MAX_LEN (SIZE_MAX - ZEND_MM_ALIGNED_SIZE(_ZSTR_HEADER_SIZE + 1))
92+
#define ZSTR_MAX_OVERHEAD (ZEND_MM_ALIGNED_SIZE(_ZSTR_HEADER_SIZE + 1))
93+
#define ZSTR_MAX_LEN (SIZE_MAX - ZSTR_MAX_OVERHEAD)
9394

9495
#define ZSTR_ALLOCA_ALLOC(str, _len, use_heap) do { \
9596
(str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \

ext/pcre/php_pcre.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,7 +1726,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su
17261726
}
17271727

17281728
if (new_len >= alloc_len) {
1729-
alloc_len = zend_safe_address_guarded(2, new_len, 0);
1729+
alloc_len = zend_safe_address_guarded(2, new_len, ZSTR_MAX_OVERHEAD) - ZSTR_MAX_OVERHEAD;
17301730
if (result == NULL) {
17311731
result = zend_string_alloc(alloc_len, 0);
17321732
} else {
@@ -1962,9 +1962,9 @@ static zend_string *php_pcre_replace_func_impl(pcre_cache_entry *pce, zend_strin
19621962
pcre2_get_mark(match_data), flags);
19631963

19641964
ZEND_ASSERT(eval_result);
1965-
new_len = zend_safe_address_guarded(1, ZSTR_LEN(eval_result), new_len);
1965+
new_len = zend_safe_address_guarded(1, ZSTR_LEN(eval_result) + ZSTR_MAX_OVERHEAD, new_len) -ZSTR_MAX_OVERHEAD;
19661966
if (new_len >= alloc_len) {
1967-
alloc_len = zend_safe_address_guarded(2, new_len, 0);
1967+
alloc_len = zend_safe_address_guarded(2, new_len, ZSTR_MAX_OVERHEAD) - ZSTR_MAX_OVERHEAD;
19681968
if (result == NULL) {
19691969
result = zend_string_alloc(alloc_len, 0);
19701970
} else {

0 commit comments

Comments
 (0)