diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-09-03 09:51:54 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-09-03 09:51:54 +0200 |
commit | daf222c9f88e2aac41437ca97cfe2c60300eed23 (patch) | |
tree | eed487e30b730e6357be6027bf871bed8a0e879f | |
parent | 6b521a98d457ae4265f38a65861c723220256110 (diff) | |
parent | 0fc65ed13373b1276062cda5b1e4993243203e5e (diff) | |
download | php-git-daf222c9f88e2aac41437ca97cfe2c60300eed23.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Handle memory limit error during string reallocation correctly
-rw-r--r-- | Zend/zend_string.h | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 316d022e64..557042b3e3 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -205,12 +205,13 @@ static zend_always_inline zend_string *zend_string_realloc(zend_string *s, size_ ZSTR_LEN(ret) = len; zend_string_forget_hash_val(ret); return ret; - } else { - GC_DELREF(s); } } ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), MIN(len, ZSTR_LEN(s)) + 1); + if (!ZSTR_IS_INTERNED(s)) { + GC_DELREF(s); + } return ret; } @@ -225,12 +226,13 @@ static zend_always_inline zend_string *zend_string_extend(zend_string *s, size_t ZSTR_LEN(ret) = len; zend_string_forget_hash_val(ret); return ret; - } else { - GC_DELREF(s); } } ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), ZSTR_LEN(s) + 1); + if (!ZSTR_IS_INTERNED(s)) { + GC_DELREF(s); + } return ret; } @@ -245,12 +247,13 @@ static zend_always_inline zend_string *zend_string_truncate(zend_string *s, size ZSTR_LEN(ret) = len; zend_string_forget_hash_val(ret); return ret; - } else { - GC_DELREF(s); } } ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), len + 1); + if (!ZSTR_IS_INTERNED(s)) { + GC_DELREF(s); + } return ret; } @@ -264,12 +267,13 @@ static zend_always_inline zend_string *zend_string_safe_realloc(zend_string *s, ZSTR_LEN(ret) = (n * m) + l; zend_string_forget_hash_val(ret); return ret; - } else { - GC_DELREF(s); } } ret = zend_string_safe_alloc(n, m, l, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), MIN((n * m) + l, ZSTR_LEN(s)) + 1); + if (!ZSTR_IS_INTERNED(s)) { + GC_DELREF(s); + } return ret; } |