From 669aebf1bc7966a5079aa143f1621958609b7b7d Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Fri, 25 Jul 2014 11:55:04 +0200 Subject: [PATCH] Fix CID 1128968 Iterator modified during loop --- .../src/main/java/streamer/BaseElement.java | 7 ++- .../test/java/streamer/BaseElementTest.java | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.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 1ca68ceaa80..a93b0371b0b 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 pads = new HashMap(); + pads.putAll(inputPads); + for (DataSource source : pads.values()) { Link link = (Link)source; ByteBuffer buf = link.pull(block); 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 00000000000..1521d2f8b35 --- /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); + } + +}