From 3a3dcacefc6862f7e5caa4d7d5f81dbe133b2b5c Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Thu, 11 Aug 2022 14:16:16 -0400 Subject: [PATCH] GP-2441 corrected concurrent modification error when cleaning-up stale block stream registrations on Ghidra Server --- .../ghidra/server/stream/BlockStreamServer.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/BlockStreamServer.java b/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/BlockStreamServer.java index 57c923bab6..e71534d962 100644 --- a/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/BlockStreamServer.java +++ b/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/BlockStreamServer.java @@ -17,8 +17,7 @@ package ghidra.server.stream; import java.io.*; import java.net.*; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -167,10 +166,11 @@ public class BlockStreamServer extends Thread { */ private void cleanupStaleRequests(boolean cleanupAll) { synchronized (blockStreamMap) { + List staleStreamIds = new ArrayList<>(); for (BlockStreamRegistration registration : blockStreamMap.values()) { long age = System.currentTimeMillis() - registration.timestamp; if (age > MAX_AGE_MS) { - blockStreamMap.remove(registration.streamHandle.getStreamID()); + staleStreamIds.add(registration.streamHandle.getStreamID()); try { registration.blockStream.close(); } @@ -179,6 +179,9 @@ public class BlockStreamServer extends Thread { } } } + for (long id : staleStreamIds) { + blockStreamMap.remove(id); + } } } @@ -187,7 +190,7 @@ public class BlockStreamServer extends Thread { * this method will return immediately. * @param s server socket to be used for accepting connections * @param host remote access hostname to be used by clients - * @throws IOException + * @throws IOException if an IO error occurs */ public synchronized void startServer(ServerSocket s, String host) throws IOException { @@ -348,7 +351,7 @@ public class BlockStreamServer extends Thread { * Read the stream request header which must be the first input * received from the client. * @return StreamRequest data presented by client - * @throws IOException + * @throws IOException if an IO error occurs */ private StreamRequest readStreamRequest() throws IOException {