summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/array.c2
-rw-r--r--ext/standard/tests/array/bug41686.phpt56
2 files changed, 57 insertions, 1 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 1901630ef5..b698ead1ee 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -2213,7 +2213,7 @@ PHP_FUNCTION(array_slice)
is not passed */
convert_to_long_ex(offset);
offset_val = Z_LVAL_PP(offset);
- if (argc >= 3) {
+ if (argc >= 3 && Z_TYPE_PP(length) != IS_NULL) {
convert_to_long_ex(length);
length_val = Z_LVAL_PP(length);
} else {
diff --git a/ext/standard/tests/array/bug41686.phpt b/ext/standard/tests/array/bug41686.phpt
new file mode 100644
index 0000000000..9f1384eddd
--- /dev/null
+++ b/ext/standard/tests/array/bug41686.phpt
@@ -0,0 +1,56 @@
+--TEST--
+Bug #41686 (Omitting length param in array_slice not possible)
+--FILE--
+<?php
+$a = array(1,2,3);
+$b = array('a'=>1,'b'=>1,'c'=>2);
+
+var_dump(
+ array_slice($a, 1),
+ array_slice($a, 1, 2, TRUE),
+ array_slice($a, 1, NULL, TRUE),
+ array_slice($b, 1),
+ array_slice($b, 1, 2, TRUE),
+ array_slice($b, 1, NULL, TRUE)
+);
+
+echo "Done\n";
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ int(2)
+ [1]=>
+ int(3)
+}
+array(2) {
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
+array(2) {
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
+array(2) {
+ ["b"]=>
+ int(1)
+ ["c"]=>
+ int(2)
+}
+array(2) {
+ ["b"]=>
+ int(1)
+ ["c"]=>
+ int(2)
+}
+array(2) {
+ ["b"]=>
+ int(1)
+ ["c"]=>
+ int(2)
+}
+Done \ No newline at end of file