You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by hu...@apache.org on 2014/07/25 11:59:58 UTC

git commit: updated refs/heads/master to 669aebf

Repository: cloudstack
Updated Branches:
  refs/heads/master 47d6a64b3 -> 669aebf1b


Fix CID 1128968 Iterator modified during loop


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/669aebf1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/669aebf1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/669aebf1

Branch: refs/heads/master
Commit: 669aebf1bc7966a5079aa143f1621958609b7b7d
Parents: 47d6a64
Author: Hugo Trippaers <ht...@schubergphilis.com>
Authored: Fri Jul 25 11:55:04 2014 +0200
Committer: Hugo Trippaers <ht...@schubergphilis.com>
Committed: Fri Jul 25 11:58:16 2014 +0200

----------------------------------------------------------------------
 .../src/main/java/streamer/BaseElement.java     |  7 ++-
 .../src/test/java/streamer/BaseElementTest.java | 50 ++++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/669aebf1/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java
index 1ca68ce..a93b037 100755
--- a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java
+++ b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java
@@ -149,7 +149,12 @@ public class BaseElement implements Element {
      */
     @Override
     public void poll(boolean block) {
-        for (DataSource source : inputPads.values()) {
+        // inputPads can be changed in handleData (see switchOff in OneTimeSwitch)
+        // as this results in an undefined response from the iterator on inputPads
+        // use a copy of the map to iterate over.
+        Map<String, DataSource> pads = new HashMap<String, DataSource>();
+        pads.putAll(inputPads);
+        for (DataSource source : pads.values()) {
             Link link = (Link)source;
             ByteBuffer buf = link.pull(block);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/669aebf1/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java
----------------------------------------------------------------------
diff --git a/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java b/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java
new file mode 100644
index 0000000..1521d2f
--- /dev/null
+++ b/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java
@@ -0,0 +1,50 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package streamer;
+
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+
+public class BaseElementTest {
+
+    @Test
+    public void testPoll() {
+        BaseElement element = new BaseElement("test") {
+
+            @Override
+            public void handleData(ByteBuffer buf, Link link) {
+                inputPads.remove("testpad1");
+                inputPads.remove("testpad2");
+            }
+
+        };
+        Link testLink1 = mock(Link.class);
+        when(testLink1.pull(anyBoolean())).thenReturn(new ByteBuffer("hello".getBytes()));
+        Link testLink2 = mock(Link.class);
+        when(testLink2.pull(anyBoolean())).thenReturn(new ByteBuffer("hello".getBytes()));
+
+        element.setLink("testpad1", testLink1, streamer.Direction.IN);
+        element.setLink("testpad2", testLink2, streamer.Direction.IN);
+        element.poll(false);
+    }
+
+}