diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2018-11-15 17:17:06 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-11-15 17:17:06 +0100 |
commit | 8f2f80668e6988ac8907920d177e531a98dcb8b0 (patch) | |
tree | 049a64d23919471734cb6d4ce193c6f765b05b2b | |
parent | 71d6899e535d960d9b43d75ed2b7073288c13b59 (diff) | |
parent | dee5a450d9b7f7b03f012dd1912cc0a3dcb0482c (diff) | |
download | php-git-8f2f80668e6988ac8907920d177e531a98dcb8b0.tar.gz |
Merge branch 'PHP-7.3'
-rw-r--r-- | Zend/zend_types.h | 8 | ||||
-rw-r--r-- | ext/mbstring/mbstring.c | 8 | ||||
-rw-r--r-- | ext/mbstring/tests/bug77165.phpt | 11 |
3 files changed, 23 insertions, 4 deletions
diff --git a/Zend/zend_types.h b/Zend/zend_types.h index d17443aa1e..ece1bdd900 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -570,6 +570,14 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_DEL_FLAGS(p, GC_PROTECTED); \ } while (0) +#define GC_TRY_PROTECT_RECURSION(p) do { \ + if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_PROTECT_RECURSION(p); \ + } while (0) + +#define GC_TRY_UNPROTECT_RECURSION(p) do { \ + if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_UNPROTECT_RECURSION(p); \ + } while (0) + #define Z_IS_RECURSIVE(zval) GC_IS_RECURSIVE(Z_COUNTED(zval)) #define Z_PROTECT_RECURSION(zval) GC_PROTECT_RECURSION(Z_COUNTED(zval)) #define Z_UNPROTECT_RECURSION(zval) GC_UNPROTECT_RECURSION(Z_COUNTED(zval)) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 7aa323ddbb..cdca12b00e 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -3075,7 +3075,7 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons php_error_docref(NULL, E_WARNING, "Cannot convert recursively referenced values"); return NULL; } - GC_PROTECT_RECURSION(input); + GC_TRY_PROTECT_RECURSION(input); output = zend_new_array(zend_hash_num_elements(input)); ZEND_HASH_FOREACH_KEY_VAL(input, idx, key, entry) { /* convert key */ @@ -3120,7 +3120,7 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons zend_hash_index_add(output, idx, &entry_tmp); } } ZEND_HASH_FOREACH_END(); - GC_UNPROTECT_RECURSION(input); + GC_TRY_UNPROTECT_RECURSION(input); return output; } @@ -4682,7 +4682,7 @@ MBSTRING_API int php_mb_check_encoding_recursive(HashTable *vars, const zend_str php_error_docref(NULL, E_WARNING, "Cannot not handle circular references"); return 0; } - GC_PROTECT_RECURSION(vars); + GC_TRY_PROTECT_RECURSION(vars); ZEND_HASH_FOREACH_KEY_VAL(vars, idx, key, entry) { ZVAL_DEREF(entry); if (key) { @@ -4716,7 +4716,7 @@ MBSTRING_API int php_mb_check_encoding_recursive(HashTable *vars, const zend_str break; } } ZEND_HASH_FOREACH_END(); - GC_UNPROTECT_RECURSION(vars); + GC_TRY_UNPROTECT_RECURSION(vars); mbfl_buffer_converter_delete(convd); return valid; } diff --git a/ext/mbstring/tests/bug77165.phpt b/ext/mbstring/tests/bug77165.phpt new file mode 100644 index 0000000000..69708f613a --- /dev/null +++ b/ext/mbstring/tests/bug77165.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #77165: mb_check_encoding crashes when argument given an empty array +--FILE-- +<?php +var_dump(mb_check_encoding(array())); +var_dump(mb_convert_encoding(array(), 'UTF-8')); +?> +--EXPECT-- +bool(true) +array(0) { +} |