Skip to content

Commit a4e16cd

Browse files
committed
Merge branch 'PHP-7.0'
* PHP-7.0: update NEWS refix bug #70895 Fixed bug Bug #70895 null ptr deref and segfault
2 parents 09aa68b + a1e8b74 commit a4e16cd

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

Zend/tests/bug70895.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Bug #70895 null ptr deref and segfault with crafted calable
3+
--FILE--
4+
<?php
5+
6+
array_map("%n", 0);
7+
array_map("%n %i", 0);
8+
array_map("%n %i aoeu %f aoeu %p", 0);
9+
?>
10+
--EXPECTREGEX--
11+
Warning: array_map\(\) expects parameter 1 to be a valid callback, function '%n' not found or invalid function name in .+
12+
13+
Warning: array_map\(\) expects parameter 1 to be a valid callback, function '%n %i' not found or invalid function name in .+
14+
15+
Warning: array_map\(\) expects parameter 1 to be a valid callback, function '%n %i aoeu %f aoeu %p' not found or invalid function name in .+bug70895.php on line \d+

Zend/zend_API.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,17 +242,37 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in
242242
const char *space;
243243
const char *class_name = get_active_class_name(&space);
244244

245+
size_t error_len = strlen(error), sanitized_error_len = error_len, k = 0, n = 0;
246+
char *sanitized_error = emalloc(sizeof(char) * error_len);
247+
248+
while (k < error_len) {
249+
sanitized_error[n] = error[k];
250+
if ('%' == error[k]) {
251+
n++;
252+
sanitized_error[n] = '%';
253+
}
254+
k++;
255+
n++;
256+
257+
if (n == sanitized_error_len) {
258+
sanitized_error_len += error_len - k;
259+
sanitized_error = erealloc(sanitized_error, sanitized_error_len);
260+
}
261+
}
262+
sanitized_error[n] = '\0';
263+
245264
if (severity == E_WARNING) {
246265
zend_internal_type_error(ZEND_ARG_USES_STRICT_TYPES(), "%s%s%s() expects parameter %d to be a valid callback, %s",
247-
class_name, space, get_active_function_name(), num, error);
266+
class_name, space, get_active_function_name(), num, sanitized_error);
248267
} else if (severity == E_ERROR) {
249268
zend_throw_error(zend_ce_type_error, "%s%s%s() expects parameter %d to be a valid callback, %s",
250-
class_name, space, get_active_function_name(), num, error);
269+
class_name, space, get_active_function_name(), num, sanitized_error);
251270
} else {
252271
zend_error(severity, "%s%s%s() expects parameter %d to be a valid callback, %s",
253-
class_name, space, get_active_function_name(), num, error);
272+
class_name, space, get_active_function_name(), num, sanitized_error);
254273
}
255274
efree(error);
275+
efree(sanitized_error);
256276
}
257277
/* }}} */
258278

0 commit comments

Comments
 (0)