WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 1e1036c

Browse files
committed
fix: disable usage of JDK Unsafe class in GSON (#2341)
1 parent 60dcdc7 commit 1e1036c

File tree

20 files changed

+138
-108
lines changed

20 files changed

+138
-108
lines changed

jadx-core/src/main/java/jadx/core/codegen/json/JsonCodeGen.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import com.google.gson.FieldNamingPolicy;
1111
import com.google.gson.Gson;
12-
import com.google.gson.GsonBuilder;
1312

1413
import jadx.api.ICodeInfo;
1514
import jadx.api.ICodeWriter;
@@ -32,13 +31,13 @@
3231
import jadx.core.dex.nodes.FieldNode;
3332
import jadx.core.dex.nodes.MethodNode;
3433
import jadx.core.dex.nodes.RootNode;
34+
import jadx.core.utils.GsonUtils;
3535
import jadx.core.utils.Utils;
3636
import jadx.core.utils.exceptions.JadxRuntimeException;
3737

3838
public class JsonCodeGen {
3939

40-
private static final Gson GSON = new GsonBuilder()
41-
.setPrettyPrinting()
40+
private static final Gson GSON = GsonUtils.defaultGsonBuilder()
4241
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
4342
.disableHtmlEscaping()
4443
.create();

jadx-core/src/main/java/jadx/core/codegen/json/JsonMappingGen.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import com.google.gson.FieldNamingPolicy;
1313
import com.google.gson.Gson;
14-
import com.google.gson.GsonBuilder;
1514

1615
import jadx.api.JadxArgs;
1716
import jadx.core.codegen.json.mapping.JsonClsMapping;
@@ -24,14 +23,14 @@
2423
import jadx.core.dex.nodes.FieldNode;
2524
import jadx.core.dex.nodes.MethodNode;
2625
import jadx.core.dex.nodes.RootNode;
26+
import jadx.core.utils.GsonUtils;
2727
import jadx.core.utils.exceptions.JadxRuntimeException;
2828
import jadx.core.utils.files.FileUtils;
2929

3030
public class JsonMappingGen {
3131
private static final Logger LOG = LoggerFactory.getLogger(JsonMappingGen.class);
3232

33-
private static final Gson GSON = new GsonBuilder()
34-
.setPrettyPrinting()
33+
private static final Gson GSON = GsonUtils.defaultGsonBuilder()
3534
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES)
3635
.disableHtmlEscaping()
3736
.create();

jadx-core/src/main/java/jadx/core/utils/GsonUtils.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import java.lang.reflect.Type;
44

5+
import com.google.gson.Gson;
6+
import com.google.gson.GsonBuilder;
7+
import com.google.gson.InstanceCreator;
58
import com.google.gson.JsonDeserializationContext;
69
import com.google.gson.JsonDeserializer;
710
import com.google.gson.JsonElement;
@@ -11,11 +14,27 @@
1114

1215
public class GsonUtils {
1316

17+
public static Gson buildGson() {
18+
return defaultGsonBuilder().create();
19+
}
20+
21+
public static GsonBuilder defaultGsonBuilder() {
22+
return new GsonBuilder()
23+
.disableJdkUnsafe()
24+
.setPrettyPrinting();
25+
}
26+
27+
public static void fillObjectFromJsonString(GsonBuilder builder, Object obj, String jsonStr) {
28+
Class<?> type = obj.getClass();
29+
Gson gson = builder.registerTypeAdapter(type, (InstanceCreator<?>) t -> obj).create();
30+
gson.fromJson(jsonStr, type);
31+
}
32+
1433
public static <T> InterfaceReplace<T> interfaceReplace(Class<T> replaceCls) {
1534
return new InterfaceReplace<>(replaceCls);
1635
}
1736

18-
private static final class InterfaceReplace<T> implements JsonSerializer<T>, JsonDeserializer<T> {
37+
public static final class InterfaceReplace<T> implements JsonSerializer<T>, JsonDeserializer<T> {
1938
private final Class<T> replaceCls;
2039

2140
private InterfaceReplace(Class<T> replaceCls) {

jadx-gui/build.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,8 @@ runtime {
141141
"java.desktop",
142142
"java.naming",
143143
"java.xml",
144-
// needed for "https" protocol to get plugins and updates
144+
// needed for "https" protocol to download plugins and updates
145145
"jdk.crypto.cryptoki",
146-
// add Unsafe class, used by GSON
147-
"jdk.unsupported",
148146
)
149147
jpackage {
150148
imageOptions = listOf("--icon", "$projectDir/src/main/resources/logos/jadx-logo.ico")

jadx-gui/src/main/java/jadx/gui/cache/manager/CacheManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import org.slf4j.LoggerFactory;
2020

2121
import com.google.gson.Gson;
22-
import com.google.gson.GsonBuilder;
2322
import com.google.gson.reflect.TypeToken;
2423

2524
import jadx.api.plugins.utils.CommonFileUtils;
25+
import jadx.core.utils.GsonUtils;
2626
import jadx.core.utils.Utils;
2727
import jadx.core.utils.exceptions.JadxRuntimeException;
2828
import jadx.core.utils.files.FileUtils;
@@ -34,7 +34,7 @@
3434
public class CacheManager {
3535
private static final Logger LOG = LoggerFactory.getLogger(CacheManager.class);
3636

37-
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
37+
private static final Gson GSON = GsonUtils.buildGson();
3838
private static final Type CACHES_TYPE = new TypeToken<List<CacheEntry>>() {
3939
}.getType();
4040

jadx-gui/src/main/java/jadx/gui/device/debugger/BreakpointManager.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,18 @@
2222
import org.slf4j.LoggerFactory;
2323

2424
import com.google.gson.Gson;
25-
import com.google.gson.GsonBuilder;
2625
import com.google.gson.reflect.TypeToken;
2726

2827
import jadx.core.dex.nodes.ClassNode;
2928
import jadx.gui.device.debugger.smali.Smali;
3029
import jadx.gui.treemodel.JClass;
3130

31+
import static jadx.core.utils.GsonUtils.buildGson;
32+
3233
public class BreakpointManager {
3334
private static final Logger LOG = LoggerFactory.getLogger(BreakpointManager.class);
3435

35-
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
36+
private static final Gson GSON = buildGson();
3637
private static final Type TYPE_TOKEN = new TypeToken<Map<String, List<FileBreakpoint>>>() {
3738
}.getType();
3839

@@ -159,9 +160,13 @@ public interface Listener {
159160
}
160161

161162
protected static class FileBreakpoint {
162-
final String cls;
163-
final String mth;
164-
final long codeOffset;
163+
public String cls;
164+
public String mth;
165+
public long codeOffset;
166+
167+
public FileBreakpoint() {
168+
// needed for JSON deserialization
169+
}
165170

166171
private FileBreakpoint(String cls, String mth, long codeOffset) {
167172
this.cls = cls;

jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414

15-
import com.google.gson.Gson;
16-
import com.google.gson.GsonBuilder;
17-
1815
import jadx.api.ICodeInfo;
1916
import jadx.api.impl.SimpleCodeInfo;
17+
import jadx.core.utils.GsonUtils;
2018
import jadx.gui.treemodel.JClass;
2119
import jadx.gui.treemodel.JNode;
2220
import jadx.gui.ui.panel.ContentPanel;
@@ -30,8 +28,6 @@ public class QuarkReportNode extends JNode {
3028

3129
private static final Logger LOG = LoggerFactory.getLogger(QuarkReportNode.class);
3230

33-
private static final Gson GSON = new GsonBuilder().create();
34-
3531
private static final ImageIcon ICON = UiUtils.openSvgIcon("ui/quark");
3632

3733
private final Path reportFile;
@@ -62,7 +58,7 @@ public ContentPanel getContentPanel(TabbedPane tabbedPane) {
6258
try {
6359
QuarkReportData data;
6460
try (BufferedReader reader = Files.newBufferedReader(reportFile)) {
65-
data = GSON.fromJson(reader, QuarkReportData.class);
61+
data = GsonUtils.buildGson().fromJson(reader, QuarkReportData.class);
6662
}
6763
data.validate();
6864
return new QuarkReportPanel(tabbedPane, this, data);

jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.slf4j.LoggerFactory;
2222

2323
import com.google.gson.Gson;
24-
import com.google.gson.GsonBuilder;
2524

2625
import jadx.api.JadxArgs;
2726
import jadx.api.data.ICodeComment;
@@ -34,7 +33,6 @@
3433
import jadx.api.data.impl.JadxCodeRename;
3534
import jadx.api.data.impl.JadxNodeRef;
3635
import jadx.api.plugins.utils.CommonFileUtils;
37-
import jadx.core.utils.GsonUtils;
3836
import jadx.core.utils.exceptions.JadxRuntimeException;
3937
import jadx.core.utils.files.FileUtils;
4038
import jadx.gui.cache.manager.CacheManager;
@@ -44,6 +42,9 @@
4442
import jadx.gui.ui.codearea.EditorViewState;
4543
import jadx.gui.utils.RelativePathTypeAdapter;
4644

45+
import static jadx.core.utils.GsonUtils.defaultGsonBuilder;
46+
import static jadx.core.utils.GsonUtils.interfaceReplace;
47+
4748
public class JadxProject {
4849
private static final Logger LOG = LoggerFactory.getLogger(JadxProject.class);
4950

@@ -335,13 +336,12 @@ public static ProjectData loadProjectData(Path path) {
335336
}
336337

337338
private static Gson buildGson(Path basePath) {
338-
return new GsonBuilder()
339+
return defaultGsonBuilder()
339340
.registerTypeHierarchyAdapter(Path.class, new RelativePathTypeAdapter(basePath))
340-
.registerTypeAdapter(ICodeComment.class, GsonUtils.interfaceReplace(JadxCodeComment.class))
341-
.registerTypeAdapter(ICodeRename.class, GsonUtils.interfaceReplace(JadxCodeRename.class))
342-
.registerTypeAdapter(IJavaNodeRef.class, GsonUtils.interfaceReplace(JadxNodeRef.class))
343-
.registerTypeAdapter(IJavaCodeRef.class, GsonUtils.interfaceReplace(JadxCodeRef.class))
344-
.setPrettyPrinting()
341+
.registerTypeAdapter(ICodeComment.class, interfaceReplace(JadxCodeComment.class))
342+
.registerTypeAdapter(ICodeRename.class, interfaceReplace(JadxCodeRename.class))
343+
.registerTypeAdapter(IJavaNodeRef.class, interfaceReplace(JadxNodeRef.class))
344+
.registerTypeAdapter(IJavaCodeRef.class, interfaceReplace(JadxCodeRef.class))
345345
.create();
346346
}
347347

jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import com.google.gson.FieldAttributes;
1616
import com.google.gson.Gson;
1717
import com.google.gson.GsonBuilder;
18-
import com.google.gson.InstanceCreator;
1918
import com.google.gson.JsonObject;
2019

20+
import jadx.core.utils.GsonUtils;
2121
import jadx.gui.utils.PathTypeAdapter;
2222
import jadx.gui.utils.RectangleTypeAdapter;
2323

@@ -34,20 +34,16 @@ public boolean shouldSkipField(FieldAttributes f) {
3434
|| f.hasModifier(Modifier.PUBLIC)
3535
|| f.hasModifier(Modifier.TRANSIENT)
3636
|| f.hasModifier(Modifier.STATIC)
37-
|| (f.getAnnotation(GsonExclude.class) != null);
37+
|| f.getAnnotation(GsonExclude.class) != null;
3838
}
3939

4040
@Override
4141
public boolean shouldSkipClass(Class<?> clazz) {
4242
return false;
4343
}
4444
};
45-
private static final GsonBuilder GSON_BUILDER = new GsonBuilder()
46-
.setExclusionStrategies(EXCLUDE_FIELDS)
47-
.registerTypeHierarchyAdapter(Path.class, PathTypeAdapter.singleton())
48-
.registerTypeHierarchyAdapter(Rectangle.class, RectangleTypeAdapter.singleton())
49-
.setPrettyPrinting();
50-
private static final Gson GSON = GSON_BUILDER.create();
45+
46+
private static final Gson GSON = makeGsonBuilder().create();
5147

5248
private JadxSettingsAdapter() {
5349
}
@@ -92,17 +88,18 @@ public static JsonObject makeJsonObject(JadxSettings settings) {
9288
}
9389

9490
public static void fill(JadxSettings settings, String jsonStr) {
95-
populate(GSON_BUILDER, jsonStr, JadxSettings.class, settings);
91+
GsonUtils.fillObjectFromJsonString(makeGsonBuilder(), settings, jsonStr);
9692
}
9793

98-
private static <T> void populate(GsonBuilder builder, String json, Class<T> type, final T into) {
99-
builder.registerTypeAdapter(type, (InstanceCreator<T>) t -> into)
100-
.create()
101-
.fromJson(json, type);
94+
private static GsonBuilder makeGsonBuilder() {
95+
return GsonUtils.defaultGsonBuilder()
96+
.setExclusionStrategies(EXCLUDE_FIELDS)
97+
.registerTypeHierarchyAdapter(Path.class, PathTypeAdapter.singleton())
98+
.registerTypeHierarchyAdapter(Rectangle.class, RectangleTypeAdapter.singleton());
10299
}
103100

104101
/**
105-
* Annotation for specifying fields that should not be be saved/loaded
102+
* Annotation for specifying fields that should not be saved/loaded
106103
*/
107104
@Retention(RetentionPolicy.RUNTIME)
108105
@Target(ElementType.FIELD)

jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.slf4j.Logger;
4343
import org.slf4j.LoggerFactory;
4444

45-
import com.google.gson.GsonBuilder;
4645
import com.google.gson.JsonObject;
4746

4847
import jadx.api.CommentsLevel;
@@ -57,6 +56,7 @@
5756
import jadx.api.plugins.events.JadxEvents;
5857
import jadx.api.plugins.events.types.ReloadSettingsWindow;
5958
import jadx.api.plugins.gui.ISettingsGroup;
59+
import jadx.core.utils.GsonUtils;
6060
import jadx.gui.settings.JadxSettings;
6161
import jadx.gui.settings.JadxSettingsAdapter;
6262
import jadx.gui.settings.JadxUpdateChannel;
@@ -747,7 +747,7 @@ private void copySettings() {
747747
settingsJson.remove("lastOpenFilePath");
748748
settingsJson.remove("lastSaveFilePath");
749749
settingsJson.remove("recentProjects");
750-
String settingsText = new GsonBuilder().setPrettyPrinting().create().toJson(settingsJson);
750+
String settingsText = GsonUtils.buildGson().toJson(settingsJson);
751751
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
752752
StringSelection selection = new StringSelection(settingsText);
753753
clipboard.setContents(selection, selection);

0 commit comments

Comments
 (0)