From: Antony Dovgal Date: Wed, 15 Nov 2006 22:09:25 +0000 (+0000) Subject: fix memory leak and typo in zend_parse_parameters(), which caused segfault X-Git-Tag: RELEASE_1_0_0RC1~995 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=37754b437fe75c423bc6797ccc7a6217b92a7e31;p=php fix memory leak and typo in zend_parse_parameters(), which caused segfault add test --- diff --git a/ext/standard/array.c b/ext/standard/array.c index 54f3c494f0..e66cfa4846 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2669,7 +2669,7 @@ PHP_FUNCTION(array_pad) int do_pad; /* Whether we should do padding at all */ int i; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|lz", &input, &pad_size, &pad_value) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "alz", &input, &pad_size, &pad_value) == FAILURE) { return; } @@ -2690,6 +2690,7 @@ PHP_FUNCTION(array_pad) num_pads = pad_size_abs - input_size; if (num_pads > 1048576) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "You may only pad up to 1048576 elements at a time"); + zval_dtor(return_value); RETURN_FALSE; } pads = (zval ***)safe_emalloc(num_pads, sizeof(zval **), 0); diff --git a/ext/standard/tests/array/array_pad.phpt b/ext/standard/tests/array/array_pad.phpt new file mode 100644 index 0000000000..16419b8465 --- /dev/null +++ b/ext/standard/tests/array/array_pad.phpt @@ -0,0 +1,173 @@ +--TEST-- +array_pad() tests +--FILE-- + +--EXPECTF-- +Warning: array_pad() expects exactly 3 parameters, 0 given in %s on line %d +NULL + +Warning: array_pad() expects exactly 3 parameters, 1 given in %s on line %d +NULL + +Warning: array_pad() expects exactly 3 parameters, 2 given in %s on line %d +NULL +array(1) { + [0]=> + int(0) +} +array(0) { +} +array(1) { + [0]=> + int(0) +} +array(5) { + [0]=> + string(0) "" + [1]=> + int(-1) + [2]=> + float(2) + [3]=> + int(0) + [4]=> + int(0) +} +array(5) { + [0]=> + string(0) "" + [1]=> + int(-1) + [2]=> + float(2) + [3]=> + array(0) { + } + [4]=> + array(0) { + } +} +array(3) { + [0]=> + string(0) "" + [1]=> + int(-1) + [2]=> + float(2) +} +array(3) { + [0]=> + string(0) "" + [1]=> + int(-1) + [2]=> + float(2) +} +array(4) { + [0]=> + array(0) { + } + [1]=> + string(0) "" + [2]=> + int(-1) + [3]=> + float(2) +} + +Warning: array_pad(): You may only pad up to 1048576 elements at a time in %s on line %d +bool(false) +Done +--UEXPECTF-- +Warning: array_pad() expects exactly 3 parameters, 0 given in %s on line %d +NULL + +Warning: array_pad() expects exactly 3 parameters, 1 given in %s on line %d +NULL + +Warning: array_pad() expects exactly 3 parameters, 2 given in %s on line %d +NULL +array(1) { + [0]=> + int(0) +} +array(0) { +} +array(1) { + [0]=> + int(0) +} +array(5) { + [0]=> + unicode(0) "" + [1]=> + int(-1) + [2]=> + float(2) + [3]=> + int(0) + [4]=> + int(0) +} +array(5) { + [0]=> + unicode(0) "" + [1]=> + int(-1) + [2]=> + float(2) + [3]=> + array(0) { + } + [4]=> + array(0) { + } +} +array(3) { + [0]=> + unicode(0) "" + [1]=> + int(-1) + [2]=> + float(2) +} +array(3) { + [0]=> + unicode(0) "" + [1]=> + int(-1) + [2]=> + float(2) +} +array(4) { + [0]=> + array(0) { + } + [1]=> + unicode(0) "" + [2]=> + int(-1) + [3]=> + float(2) +} + +Warning: array_pad(): You may only pad up to 1048576 elements at a time in %s on line %d +bool(false) +Done