Skip to content

Commit 18155cb

Browse files
committed
fix inheritance issues.
1 parent 785c650 commit 18155cb

File tree

7 files changed

+114
-27
lines changed

7 files changed

+114
-27
lines changed

src/main/java/net/cvs0/config/ObfuscationConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ public boolean isInPackageScope(String className)
9494
if (packageScope == null || packageScope.isEmpty()) {
9595
return true;
9696
}
97+
if (className == null) {
98+
return false;
99+
}
97100
return className.startsWith(packageScope);
98101
}
99102

src/main/java/net/cvs0/core/ObfuscationEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ private Map<String, byte[]> obfuscateWithTransformers(Map<String, byte[]> inputC
7373
{
7474
ObfuscationContext context = new ObfuscationContext(config);
7575

76-
if (config.isRenameClasses()) {
76+
if (config.isRenameClasses() || config.isRenameMethods() || config.isRenameFields()) {
7777
setupMappingManager(context, inputClasses);
7878
}
7979

src/main/java/net/cvs0/discovery/ClassDiscoveryVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ public void visit(int version, int access, String name, String signature, String
2222
{
2323
this.currentClassName = name;
2424
inheritanceTracker.addClass(name, superName, interfaces);
25+
26+
if ((access & Opcodes.ACC_INTERFACE) != 0) {
27+
inheritanceTracker.addInterface(name);
28+
}
29+
2530
super.visit(version, access, name, signature, superName, interfaces);
2631
}
2732

src/main/java/net/cvs0/discovery/InheritanceDiscoveryVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ public InheritanceDiscoveryVisitor(InheritanceTracker inheritanceTracker)
1717
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
1818
{
1919
inheritanceTracker.addClass(name, superName, interfaces);
20+
21+
if ((access & Opcodes.ACC_INTERFACE) != 0) {
22+
inheritanceTracker.addInterface(name);
23+
}
24+
2025
super.visit(version, access, name, signature, superName, interfaces);
2126
}
2227
}

src/main/java/net/cvs0/mappings/InheritanceTracker.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class InheritanceTracker
88
private final Map<String, Set<String>> classInterfaces = new HashMap<>();
99
private final Map<String, String> classSuperClass = new HashMap<>();
1010
private final Map<String, Set<String>> classSubClasses = new HashMap<>();
11+
private final Set<String> interfaceClasses = new HashSet<>();
1112

1213
public void addClass(String className, String superClass, String[] interfaces)
1314
{
@@ -80,8 +81,13 @@ public Set<String> getAllInterfaces(String className)
8081
return result;
8182
}
8283

84+
public void addInterface(String interfaceName)
85+
{
86+
interfaceClasses.add(interfaceName);
87+
}
88+
8389
public boolean isInterface(String className)
8490
{
85-
return interfaceImplementors.containsKey(className);
91+
return interfaceClasses.contains(className);
8692
}
8793
}

src/main/java/net/cvs0/mappings/MappingManager.java

Lines changed: 57 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.cvs0.mappings.generators.MethodNameGenerator;
77

88
import java.util.HashMap;
9+
import java.util.HashSet;
910
import java.util.Map;
1011
import java.util.Set;
1112

@@ -42,6 +43,10 @@ public void generateClassMappings(Set<String> classNames)
4243

4344
public void generateFieldMapping(String owner, String fieldName, String descriptor)
4445
{
46+
if (fieldName == null) {
47+
return;
48+
}
49+
4550
if (shouldRenameField(owner, fieldName)) {
4651
String key = owner + "." + fieldName;
4752
String newName = fieldNameGenerator.generateName(owner, fieldName, descriptor);
@@ -56,6 +61,10 @@ public void setInheritanceTracker(InheritanceTracker inheritanceTracker)
5661

5762
public void generateMethodMapping(String owner, String methodName, String descriptor)
5863
{
64+
if (methodName == null) {
65+
return;
66+
}
67+
5968
if (shouldRenameMethod(owner, methodName, descriptor)) {
6069
String key = owner + "." + methodName + descriptor;
6170

@@ -72,38 +81,59 @@ public void generateMethodMapping(String owner, String methodName, String descri
7281

7382
private void propagateMethodRename(String owner, String methodName, String descriptor, String newName)
7483
{
84+
Set<String> allRelatedClasses = new HashSet<>();
85+
7586
if (inheritanceTracker.isInterface(owner)) {
76-
Set<String> implementors = inheritanceTracker.getImplementorsOf(owner);
77-
for (String implementor : implementors) {
78-
String implKey = implementor + "." + methodName + descriptor;
79-
if (!methodMappings.containsKey(implKey)) {
80-
methodMappings.put(implKey, newName);
81-
}
82-
}
87+
allRelatedClasses.addAll(inheritanceTracker.getImplementorsOf(owner));
8388
} else {
84-
Set<String> subclasses = inheritanceTracker.getAllSubclasses(owner);
85-
for (String subclass : subclasses) {
86-
String subKey = subclass + "." + methodName + descriptor;
87-
if (!methodMappings.containsKey(subKey)) {
88-
methodMappings.put(subKey, newName);
89+
allRelatedClasses.addAll(inheritanceTracker.getAllSubclasses(owner));
90+
allRelatedClasses.addAll(inheritanceTracker.getAllSuperclasses(owner));
91+
allRelatedClasses.addAll(inheritanceTracker.getAllInterfaces(owner));
92+
}
93+
94+
for (String relatedClass : allRelatedClasses) {
95+
String relatedKey = relatedClass + "." + methodName + descriptor;
96+
if (!methodMappings.containsKey(relatedKey)) {
97+
methodMappings.put(relatedKey, newName);
98+
}
99+
}
100+
101+
if (!inheritanceTracker.isInterface(owner)) {
102+
Set<String> interfaces = inheritanceTracker.getAllInterfaces(owner);
103+
for (String iface : interfaces) {
104+
Set<String> implementors = inheritanceTracker.getImplementorsOf(iface);
105+
for (String implementor : implementors) {
106+
String implKey = implementor + "." + methodName + descriptor;
107+
if (!methodMappings.containsKey(implKey)) {
108+
methodMappings.put(implKey, newName);
109+
}
89110
}
90111
}
91112
}
92113
}
93114

94115
public String getClassMapping(String className)
95116
{
117+
if (className == null) {
118+
return null;
119+
}
96120
return classMappings.getOrDefault(className, className);
97121
}
98122

99123
public String getFieldMapping(String owner, String fieldName)
100124
{
125+
if (fieldName == null) {
126+
return null;
127+
}
101128
String key = owner + "." + fieldName;
102129
return fieldMappings.getOrDefault(key, fieldName);
103130
}
104131

105132
public String getMethodMapping(String owner, String methodName, String descriptor)
106133
{
134+
if (methodName == null) {
135+
return null;
136+
}
107137
String key = owner + "." + methodName + descriptor;
108138
return methodMappings.getOrDefault(key, methodName);
109139
}
@@ -134,7 +164,7 @@ private boolean shouldRenameClass(String className)
134164
}
135165

136166
String packageScope = config.getPackageScope();
137-
if (packageScope != null && !packageScope.isEmpty()) {
167+
if (packageScope != null && !packageScope.isEmpty() && className != null) {
138168
return className.startsWith(packageScope);
139169
}
140170

@@ -143,6 +173,10 @@ private boolean shouldRenameClass(String className)
143173

144174
private boolean shouldRenameField(String owner, String fieldName)
145175
{
176+
if (fieldName == null) {
177+
return false;
178+
}
179+
146180
if (!config.isRenameFields()) {
147181
return false;
148182
}
@@ -156,6 +190,10 @@ private boolean shouldRenameField(String owner, String fieldName)
156190

157191
private boolean shouldRenameMethod(String owner, String methodName, String descriptor)
158192
{
193+
if (methodName == null) {
194+
return false;
195+
}
196+
159197
if (!config.isRenameMethods()) {
160198
return false;
161199
}
@@ -164,11 +202,15 @@ private boolean shouldRenameMethod(String owner, String methodName, String descr
164202
return false;
165203
}
166204

167-
if (methodName.equals("<init>") || methodName.equals("<clinit>")) {
205+
if (methodName != null && (methodName.equals("<init>") || methodName.equals("<clinit>"))) {
206+
return false;
207+
}
208+
209+
if (methodName != null && methodName.startsWith("lambda$")) {
168210
return false;
169211
}
170212

171-
if (methodName.startsWith("lambda$")) {
213+
if (methodName != null && (methodName.equals("values") || methodName.equals("valueOf") || methodName.equals("$values"))) {
172214
return false;
173215
}
174216

src/main/java/net/cvs0/transformers/MethodRenameTransformer.java

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,15 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
7272

7373
String newName = context.getMethodMappings().get(methodKey);
7474
if (newName == null) {
75-
MapBasedRenamer renamer = context.getRenamer("method");
76-
newName = renamer.generateName(methodKey);
77-
context.addMethodMapping(methodKey, newName);
75+
if (context.getMappingManager() != null) {
76+
context.getMappingManager().generateMethodMapping(currentClassName, name, descriptor);
77+
newName = context.getMappingManager().getMethodMapping(currentClassName, name, descriptor);
78+
context.addMethodMapping(methodKey, newName);
79+
} else {
80+
MapBasedRenamer renamer = context.getRenamer("method");
81+
newName = renamer.generateName(methodKey);
82+
context.addMethodMapping(methodKey, newName);
83+
}
7884
Logger.mapping(methodKey, newName);
7985
}
8086

@@ -84,11 +90,15 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
8490

8591
private boolean shouldSkipMethod(String name, int access)
8692
{
87-
if (name.equals("<init>") || name.equals("<clinit>")) {
93+
if (name != null && (name.equals("<init>") || name.equals("<clinit>"))) {
94+
return true;
95+
}
96+
97+
if (name != null && name.startsWith("lambda$")) {
8898
return true;
8999
}
90100

91-
if (name.startsWith("lambda$")) {
101+
if (name != null && (name.equals("values") || name.equals("valueOf") || name.equals("$values"))) {
92102
return true;
93103
}
94104

@@ -100,7 +110,7 @@ private boolean shouldSkipMethod(String name, int access)
100110
return true;
101111
}
102112

103-
if (name.equals("main") && name.contains("([Ljava/lang/String;)V")) {
113+
if (name != null && name.equals("main")) {
104114
return true;
105115
}
106116

@@ -127,7 +137,13 @@ public void visitMethodInsn(int opcode, String owner, String name, String descri
127137

128138
if (shouldRenameMethodCall(name, owner)) {
129139
String methodKey = owner + "." + name + descriptor;
130-
String newName = context.getMethodMappings().getOrDefault(methodKey, name);
140+
String newName = context.getMethodMappings().get(methodKey);
141+
if (newName == null && context.getMappingManager() != null) {
142+
newName = context.getMappingManager().getMethodMapping(owner, name, descriptor);
143+
}
144+
if (newName == null) {
145+
newName = name;
146+
}
131147
super.visitMethodInsn(opcode, mappedOwner, newName, descriptor, isInterface);
132148
} else {
133149
super.visitMethodInsn(opcode, mappedOwner, name, descriptor, isInterface);
@@ -149,7 +165,13 @@ public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootst
149165

150166
if (shouldRenameMethodCall(methodName, owner)) {
151167
String methodKey = owner + "." + methodName + methodDesc;
152-
String newMethodName = context.getMethodMappings().getOrDefault(methodKey, methodName);
168+
String newMethodName = context.getMethodMappings().get(methodKey);
169+
if (newMethodName == null && context.getMappingManager() != null) {
170+
newMethodName = context.getMappingManager().getMethodMapping(owner, methodName, methodDesc);
171+
}
172+
if (newMethodName == null) {
173+
newMethodName = methodName;
174+
}
153175
String mappedOwner = context.getClassMappings().getOrDefault(owner, owner);
154176

155177
newArgs[i] = new Handle(handle.getTag(), mappedOwner, newMethodName, methodDesc, handle.isInterface());
@@ -167,11 +189,15 @@ public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootst
167189

168190
private boolean shouldRenameMethodCall(String name, String owner)
169191
{
170-
if (name.equals("<init>") || name.equals("<clinit>")) {
192+
if (name != null && (name.equals("<init>") || name.equals("<clinit>"))) {
193+
return false;
194+
}
195+
196+
if (name != null && name.startsWith("lambda$")) {
171197
return false;
172198
}
173199

174-
if (name.startsWith("lambda$")) {
200+
if (name != null && (name.equals("values") || name.equals("valueOf") || name.equals("$values"))) {
175201
return false;
176202
}
177203

0 commit comments

Comments
 (0)