From 50fae841b8d9d82b6ca03bb533088fe90b300d3a Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Tue, 1 Feb 2022 11:08:38 -0500 Subject: [PATCH] GP-0: Fixed timeout issue in GDB connector --- .../gdb/manager/impl/GdbManagerImpl.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java index 1c6c3cf3a1..39ec2b1fd9 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/manager/impl/GdbManagerImpl.java @@ -72,6 +72,7 @@ import sun.misc.SignalHandler; * event is processed using a {@link HandlerMap}. */ public class GdbManagerImpl implements GdbManager { + private static final int TIMEOUT_SEC = 10; private static final String GDB_IS_TERMINATING = "GDB is terminating"; public static final int MAX_CMD_LEN = 4094; // Account for longest possible line end @@ -126,7 +127,7 @@ public class GdbManagerImpl implements GdbManager { } try { String line; - while (isAlive() && null != (line = reader.readLine())) { + while (GdbManagerImpl.this.isAlive() && null != (line = reader.readLine())) { String l = line; if (interpreter == null) { if (l.startsWith("=") || l.startsWith("~")) { @@ -624,6 +625,16 @@ public class GdbManagerImpl implements GdbManager { this.newLine = newLine; } + protected void waitCheckExit(CompletableFuture future) + throws InterruptedException, ExecutionException, TimeoutException, IOException { + CompletableFuture.anyOf(future, state.waitValue(GdbState.EXIT)) + .get(TIMEOUT_SEC, TimeUnit.SECONDS); + if (state.get() == GdbState.EXIT) { + throw new IOException( + "GDB terminated early or could not be executed. Check your command line."); + } + } + @Override public void start(String gdbCmd, String... args) throws IOException { List fullargs = new ArrayList<>(); @@ -642,16 +653,12 @@ public class GdbManagerImpl implements GdbManager { iniThread.start(); try { - CompletableFuture.anyOf(iniThread.hasWriter, state.waitValue(GdbState.EXIT)) - .get(10, TimeUnit.SECONDS); + waitCheckExit(iniThread.hasWriter); } catch (InterruptedException | ExecutionException | TimeoutException e) { throw new IOException( "Could not detect GDB's interpreter mode. Try " + gdbCmd + " -i mi2"); } - if (state.get() == GdbState.EXIT) { - throw new IOException("GDB terminated before first prompt"); - } switch (iniThread.interpreter) { case CLI: Pty mi2Pty = ptyFactory.openpty(); @@ -678,7 +685,7 @@ public class GdbManagerImpl implements GdbManager { mi2Thread.setName("GDB Read MI2"); mi2Thread.start(); try { - mi2Thread.hasWriter.get(10, TimeUnit.SECONDS); + waitCheckExit(mi2Thread.hasWriter); } catch (InterruptedException | ExecutionException | TimeoutException e) { throw new IOException(