From bdd9868482bbfd3f2e394761ea047ba7602f74dc Mon Sep 17 00:00:00 2001 From: ghidravore Date: Thu, 10 Dec 2020 12:35:43 -0500 Subject: [PATCH 1/3] GP-492 fixing stack trace when re-using a graph display and the new graph excees the vertex limit --- .../graph/visualization/DefaultGraphDisplay.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java index 2ec196e242..1b8c4134b1 100644 --- a/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java +++ b/Ghidra/Features/GraphServices/src/main/java/ghidra/graph/visualization/DefaultGraphDisplay.java @@ -429,7 +429,7 @@ public class DefaultGraphDisplay implements GraphDisplay { .popupMenuGroup("z", "5") .keyBinding("escape") .enabledWhen(c -> hasSelection()) - .onAction(c -> clearSelection()) + .onAction(c -> clearSelection(true)) .buildAndInstallLocal(componentProvider); new ActionBuilder("Create Subgraph", ACTION_OWNER) @@ -451,9 +451,9 @@ public class DefaultGraphDisplay implements GraphDisplay { } - private void clearSelection() { - viewer.getSelectedVertexState().clear(); - viewer.getSelectedEdgeState().clear(); + private void clearSelection(boolean fireEvents) { + viewer.getSelectedVertexState().clear(fireEvents); + viewer.getSelectedEdgeState().clear(fireEvents); } private boolean hasSelection() { @@ -763,6 +763,8 @@ public class DefaultGraphDisplay implements GraphDisplay { * @param attributedGraph the {@link AttributedGraph} to visualize */ private void doSetGraphData(AttributedGraph attributedGraph) { + clearSelection(false); + focusedVertex = null; graph = attributedGraph; layoutTransitionManager.setEdgeComparator(new EdgeComparator(graph, "EdgeType", From f10f4d3a83eaac1786181ff134c1c3f06bc4cad4 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Thu, 10 Dec 2020 17:40:37 -0500 Subject: [PATCH 2/3] Refined library dependency search --- build.gradle | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index b5539e3409..bbe7667495 100644 --- a/build.gradle +++ b/build.gradle @@ -304,15 +304,33 @@ List getExternalRuntimeDependencies(Project project) { List getExternalDependencies(Configuration configuration) { List list = new ArrayList<>(); configuration.dependencies.each { dep -> - + // if the dependency is an external jar if (dep instanceof ExternalDependency) { + String name = dep.getName() + Set classifiers = dep.artifacts.classifier + String group = dep.getGroup() + String version = dep.getVersion() + String searchString = name + + if (version != null) { + searchString = name+"-"+version; + } + + if (!classifiers.empty) { + String cls = classifiers.first() + if (cls != null) { + searchString+= "-$cls" + } + } // loop back through all the dependency files, looking for one that contains the dependency name. String depPath = configuration.find { - it.name.contains(dep.name) + it.name.contains(searchString) + } + if (depPath == null) { + println("****************DID NOT FIND DEPENDENCY: name = "+name+" version = "+version) } - // if we found the path, then add it to the list if (depPath) { list.add(depPath) From e1e9dc0f8f257bb9a3b0cde9d3d5ade8413c41d9 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Fri, 11 Dec 2020 19:05:56 -0500 Subject: [PATCH 3/3] GP-0 ignore reserved SaveState key when restoring AnalysisStateInfo --- .../core/analysis/StoredAnalyzerTimes.java | 3 +++ .../ghidra/framework/options/CustomOption.java | 9 +++++++++ .../ghidra/framework/options/OptionType.java | 16 +++++++++------- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java index b32cff7388..8072ec72d5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/StoredAnalyzerTimes.java @@ -39,6 +39,9 @@ public class StoredAnalyzerTimes implements CustomOption { public void readState(SaveState saveState) { taskTimes.clear(); for (String taskName : saveState.getNames()) { + if (CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY.equals(taskName)) { + continue; // skip this reserved key + } taskTimes.put(taskName, saveState.getLong(taskName, 0)); } names = null; diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java index 531691d803..d5fe87f61e 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/CustomOption.java @@ -17,6 +17,15 @@ package ghidra.framework.options; public interface CustomOption { + /** + * SaveState key which corresponds to custom option + * implementation class. The use of this key/value within the stored + * state information is reserved for use by the option storage + * implementation and should be ignored by {@link #readState(SaveState)} + * implementation + */ + public final String CUSTOM_OPTION_CLASS_NAME_KEY = "CUSTOM_OPTION_CLASS"; + /** * Concrete subclass of WrappedOption should read all of its * state from the given saveState object. diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java index 9be0fc9bfc..060c11f852 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/OptionType.java @@ -100,14 +100,14 @@ public enum OptionType { static class IntStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Integer(string); + return Integer.valueOf(string); } } static class LongStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Long(string); + return Long.valueOf(string); } } @@ -121,7 +121,7 @@ public enum OptionType { static class DoubleStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Double(string); + return Double.valueOf(string); } } @@ -155,7 +155,7 @@ public enum OptionType { static class FloatStringAdapter extends StringAdapter { @Override Object stringToObject(String string) { - return new Float(string); + return Float.valueOf(string); } } @@ -216,10 +216,11 @@ public enum OptionType { @Override Object stringToObject(String string) { SaveState saveState = getSaveStateFromXmlString(string); - String customOptionClassName = saveState.getString("CUSTOM_OPTION_CLASS", null); + String customOptionClassName = + saveState.getString(CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY, null); try { Class c = Class.forName(customOptionClassName); - CustomOption option = (CustomOption) c.newInstance(); + CustomOption option = (CustomOption) c.getConstructor().newInstance(); option.readState(saveState); return option; } @@ -239,7 +240,8 @@ public enum OptionType { String objectToString(Object object) { CustomOption customOption = (CustomOption) object; SaveState saveState = new SaveState(); - saveState.putString("CUSTOM_OPTION_CLASS", object.getClass().getName()); + saveState.putString(CustomOption.CUSTOM_OPTION_CLASS_NAME_KEY, + object.getClass().getName()); customOption.writeState(saveState); return saveToXmlString(saveState); }