summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-11-15 17:17:06 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-11-15 17:17:06 +0100
commit8f2f80668e6988ac8907920d177e531a98dcb8b0 (patch)
tree049a64d23919471734cb6d4ce193c6f765b05b2b
parent71d6899e535d960d9b43d75ed2b7073288c13b59 (diff)
parentdee5a450d9b7f7b03f012dd1912cc0a3dcb0482c (diff)
downloadphp-git-8f2f80668e6988ac8907920d177e531a98dcb8b0.tar.gz
Merge branch 'PHP-7.3'
-rw-r--r--Zend/zend_types.h8
-rw-r--r--ext/mbstring/mbstring.c8
-rw-r--r--ext/mbstring/tests/bug77165.phpt11
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) {
+}