]> granicus.if.org Git - php/commitdiff
fix memory leak and typo in zend_parse_parameters(), which caused segfault
authorAntony Dovgal <tony2001@php.net>
Wed, 15 Nov 2006 22:09:25 +0000 (22:09 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 15 Nov 2006 22:09:25 +0000 (22:09 +0000)
add test

ext/standard/array.c
ext/standard/tests/array/array_pad.phpt [new file with mode: 0644]

index 54f3c494f05a55a1e86b5f4779095c3f2d326e9a..e66cfa48465ec804e9706f14615e2c07001185d5 100644 (file)
@@ -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 (file)
index 0000000..16419b8
--- /dev/null
@@ -0,0 +1,173 @@
+--TEST--
+array_pad() tests
+--FILE--
+<?php
+
+var_dump(array_pad());
+var_dump(array_pad(array()));
+var_dump(array_pad(array(), 1));
+var_dump(array_pad(array(), 1, 0));
+
+var_dump(array_pad(array(), 0, 0));
+var_dump(array_pad(array(), -1, 0));
+var_dump(array_pad(array("", -1, 2.0), 5, 0));
+var_dump(array_pad(array("", -1, 2.0), 5, array()));
+var_dump(array_pad(array("", -1, 2.0), 2, array()));
+var_dump(array_pad(array("", -1, 2.0), -3, array()));
+var_dump(array_pad(array("", -1, 2.0), -4, array()));
+var_dump(array_pad(array("", -1, 2.0), 2000000, 0));
+
+echo "Done\n";
+?>
+--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