From db8da86456e9cf0cd049d5262174509cc3209435 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Fri, 7 Jun 2024 12:30:21 -0400 Subject: [PATCH] GP-0 GNU Demangler process startup improvement --- .../ghidra/app/cmd/label/DemanglerCmd.java | 2 +- .../app/util/demangler/gnu/GnuDemangler.java | 10 +++++-- .../gnu/GnuDemanglerNativeProcess.java | 26 +++++++------------ 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/label/DemanglerCmd.java b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/label/DemanglerCmd.java index e76a9f0135..6224405778 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/label/DemanglerCmd.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/label/DemanglerCmd.java @@ -90,7 +90,7 @@ public class DemanglerCmd extends BackgroundCommand { // tell a mangled from a non-mangled symbol. // Msg.debug(this, "Unable to demangle name: " + mangled); } - catch (Exception e) { + catch (Exception e) { e.printStackTrace(); // Demangler IndexOutOfBoundsException that we're not sure how to fix setStatusMsg("Unable to demangle symbol: " + mangled + " at " + addr + ". Message: " + e.getMessage()); diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java index 50649338fc..8927d8e2cf 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java @@ -18,6 +18,8 @@ package ghidra.app.util.demangler.gnu; import java.io.File; import java.io.IOException; +import org.apache.commons.lang3.StringUtils; + import generic.jar.ResourceFile; import ghidra.app.util.demangler.*; import ghidra.app.util.opinion.ElfLoader; @@ -106,8 +108,12 @@ public class GnuDemangler implements Demangler { try { GnuDemanglerNativeProcess process = getNativeProcess(options); - String demangled = process.demangle(mangled).trim(); - if (mangled.equals(demangled) || demangled.length() == 0) { + String demangled = process.demangle(mangled); + if (demangled == null) { + throw new DemangledException(false); + } + demangled = demangled.trim(); + if (demangled.length() == 0 || mangled.equals(demangled)) { throw new DemangledException(true); } diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerNativeProcess.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerNativeProcess.java index 959396fad5..73cfa127ee 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerNativeProcess.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerNativeProcess.java @@ -18,7 +18,6 @@ package ghidra.app.util.demangler.gnu; import java.io.*; import java.nio.charset.Charset; import java.util.*; -import java.util.concurrent.TimeUnit; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; @@ -166,35 +165,30 @@ public class GnuDemanglerNativeProcess { String[] command = buildCommand(); IOException exc = null; - String err = ""; isDisposed = true; try { process = Runtime.getRuntime().exec(command); - // Give process time to load and report possible error - process.waitFor(200, TimeUnit.MILLISECONDS); InputStream in = process.getInputStream(); OutputStream out = process.getOutputStream(); reader = new BufferedReader(new InputStreamReader(in)); writer = new PrintWriter(out); - isDisposed = !process.isAlive(); - if (isDisposed) { - err = new String(process.getErrorStream().readAllBytes()); - process.destroy(); - process = null; - } + + checkForError(command); + + isDisposed = false; } catch (IOException e) { exc = e; } - catch (InterruptedException e) { - // ignore - } finally { if (isDisposed) { + if (process != null) { + process.destroy(); + } if (!getAndSetErrorDisplayed()) { - String errorDetail = err; + String errorDetail = ""; if (exc != null) { - errorDetail = exc.getMessage() + "\n" + errorDetail; + errorDetail = exc.getMessage(); } errorDetail = "GNU Demangler executable may not be compatible with your system and may need to be rebuilt.\n" + "(see InstallationGuide.html, 'Building Native Components').\n\n" + @@ -207,8 +201,6 @@ public class GnuDemanglerNativeProcess { throw exc; } } - - checkForError(command); String key = getKey(applicationName, options); processesByName.put(key, this);