Skip to content

Commit 8f2f806

Browse files
committed
Merge branch 'PHP-7.3'
2 parents 71d6899 + dee5a45 commit 8f2f806

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

Zend/zend_types.h

+8
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,14 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
570570
GC_DEL_FLAGS(p, GC_PROTECTED); \
571571
} while (0)
572572

573+
#define GC_TRY_PROTECT_RECURSION(p) do { \
574+
if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_PROTECT_RECURSION(p); \
575+
} while (0)
576+
577+
#define GC_TRY_UNPROTECT_RECURSION(p) do { \
578+
if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_UNPROTECT_RECURSION(p); \
579+
} while (0)
580+
573581
#define Z_IS_RECURSIVE(zval) GC_IS_RECURSIVE(Z_COUNTED(zval))
574582
#define Z_PROTECT_RECURSION(zval) GC_PROTECT_RECURSION(Z_COUNTED(zval))
575583
#define Z_UNPROTECT_RECURSION(zval) GC_UNPROTECT_RECURSION(Z_COUNTED(zval))

ext/mbstring/mbstring.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -3075,7 +3075,7 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
30753075
php_error_docref(NULL, E_WARNING, "Cannot convert recursively referenced values");
30763076
return NULL;
30773077
}
3078-
GC_PROTECT_RECURSION(input);
3078+
GC_TRY_PROTECT_RECURSION(input);
30793079
output = zend_new_array(zend_hash_num_elements(input));
30803080
ZEND_HASH_FOREACH_KEY_VAL(input, idx, key, entry) {
30813081
/* convert key */
@@ -3120,7 +3120,7 @@ MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, cons
31203120
zend_hash_index_add(output, idx, &entry_tmp);
31213121
}
31223122
} ZEND_HASH_FOREACH_END();
3123-
GC_UNPROTECT_RECURSION(input);
3123+
GC_TRY_UNPROTECT_RECURSION(input);
31243124

31253125
return output;
31263126
}
@@ -4682,7 +4682,7 @@ MBSTRING_API int php_mb_check_encoding_recursive(HashTable *vars, const zend_str
46824682
php_error_docref(NULL, E_WARNING, "Cannot not handle circular references");
46834683
return 0;
46844684
}
4685-
GC_PROTECT_RECURSION(vars);
4685+
GC_TRY_PROTECT_RECURSION(vars);
46864686
ZEND_HASH_FOREACH_KEY_VAL(vars, idx, key, entry) {
46874687
ZVAL_DEREF(entry);
46884688
if (key) {
@@ -4716,7 +4716,7 @@ MBSTRING_API int php_mb_check_encoding_recursive(HashTable *vars, const zend_str
47164716
break;
47174717
}
47184718
} ZEND_HASH_FOREACH_END();
4719-
GC_UNPROTECT_RECURSION(vars);
4719+
GC_TRY_UNPROTECT_RECURSION(vars);
47204720
mbfl_buffer_converter_delete(convd);
47214721
return valid;
47224722
}

ext/mbstring/tests/bug77165.phpt

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--TEST--
2+
Bug #77165: mb_check_encoding crashes when argument given an empty array
3+
--FILE--
4+
<?php
5+
var_dump(mb_check_encoding(array()));
6+
var_dump(mb_convert_encoding(array(), 'UTF-8'));
7+
?>
8+
--EXPECT--
9+
bool(true)
10+
array(0) {
11+
}

0 commit comments

Comments
 (0)