summaryrefslogtreecommitdiff
path: root/ext/spl
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2017-09-20 15:36:50 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2017-09-20 15:46:04 +0200
commiteedc060c92e12e054a542dc7156e31cec935a8d6 (patch)
tree155f56fef24c255cc6644a9b27a1d614a3441e02 /ext/spl
parent9641586efa861abc1f6b1dba9efba73a065e3ca5 (diff)
downloadphp-git-eedc060c92e12e054a542dc7156e31cec935a8d6.tar.gz
Fixed bug #73629 (SplDoublyLinkedList::setIteratorMode masks intern flags)
We must not overwrite the SPL_DLLIST_IT_FIX flag when changing the iterator mode.
Diffstat (limited to 'ext/spl')
-rw-r--r--ext/spl/spl_dllist.c2
-rw-r--r--ext/spl/tests/bug73629.phpt20
2 files changed, 21 insertions, 1 deletions
diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
index c205de5fed..db9fa838c8 100644
--- a/ext/spl/spl_dllist.c
+++ b/ext/spl/spl_dllist.c
@@ -733,7 +733,7 @@ SPL_METHOD(SplDoublyLinkedList, setIteratorMode)
return;
}
- intern->flags = value & SPL_DLLIST_IT_MASK;
+ intern->flags = value & SPL_DLLIST_IT_MASK | intern->flags & SPL_DLLIST_IT_FIX;
RETURN_LONG(intern->flags);
}
diff --git a/ext/spl/tests/bug73629.phpt b/ext/spl/tests/bug73629.phpt
new file mode 100644
index 0000000000..5b6587c685
--- /dev/null
+++ b/ext/spl/tests/bug73629.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #73629 (SplDoublyLinkedList::setIteratorMode masks intern flags)
+--FILE--
+<?php
+$q = new SplQueue();
+try {
+ $q->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
+} catch (Exception $e) {
+ echo 'unexpected exception: ' . $e->getMessage() . "\n";
+}
+try {
+ $q->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);
+} catch (Exception $e) {
+ echo 'expected exception: ' . $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--EXPECTF--
+expected exception: Iterators' LIFO/FIFO modes for SplStack/SplQueue objects are frozen
+===DONE===