diff options
| author | 2014-08-31 22:43:13 -0400 | |
|---|---|---|
| committer | 2014-08-31 22:43:13 -0400 | |
| commit | 195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3 (patch) | |
| tree | 4633bdb8f67efc9d1d3a4749ffff4f972481c608 /src/cuchaz | |
| parent | fixed crash finding related method implementations when method doesn't implem... (diff) | |
| download | enigma-195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3.tar.gz enigma-195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3.tar.xz enigma-195ffb47a68c4b40d8cc04b67e6c49d8081dc3d3.zip | |
added checks to prevent renaming classes/fields/methods/arguments to the same name as other classes/fields/methods/arguments
Diffstat (limited to 'src/cuchaz')
| -rw-r--r-- | src/cuchaz/enigma/analysis/JarIndex.java | 15 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/ClassMapping.java | 20 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/Mappings.java | 35 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/MethodMapping.java | 12 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/Renamer.java | 41 |
5 files changed, 122 insertions, 1 deletions
diff --git a/src/cuchaz/enigma/analysis/JarIndex.java b/src/cuchaz/enigma/analysis/JarIndex.java index fc19e7bc..e7c92bea 100644 --- a/src/cuchaz/enigma/analysis/JarIndex.java +++ b/src/cuchaz/enigma/analysis/JarIndex.java | |||
| @@ -891,4 +891,19 @@ public class JarIndex | |||
| 891 | } | 891 | } |
| 892 | return thing; | 892 | return thing; |
| 893 | } | 893 | } |
| 894 | |||
| 895 | public boolean containsObfClass( ClassEntry obfClassEntry ) | ||
| 896 | { | ||
| 897 | return m_obfClassEntries.contains( obfClassEntry ); | ||
| 898 | } | ||
| 899 | |||
| 900 | public boolean containsObfField( FieldEntry obfFieldEntry ) | ||
| 901 | { | ||
| 902 | return m_access.containsKey( obfFieldEntry ); | ||
| 903 | } | ||
| 904 | |||
| 905 | public boolean containsObfMethod( MethodEntry obfMethodEntry ) | ||
| 906 | { | ||
| 907 | return m_access.containsKey( obfMethodEntry ); | ||
| 908 | } | ||
| 894 | } | 909 | } |
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index 1219e7ca..5faaf2a1 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java | |||
| @@ -334,4 +334,24 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 334 | } | 334 | } |
| 335 | return false; | 335 | return false; |
| 336 | } | 336 | } |
| 337 | |||
| 338 | public boolean containsDeobfField( String name ) | ||
| 339 | { | ||
| 340 | return m_fieldsByDeobf.containsKey( name ); | ||
| 341 | } | ||
| 342 | |||
| 343 | public boolean containsDeobfMethod( String name, String signature ) | ||
| 344 | { | ||
| 345 | return m_methodsByDeobf.containsKey( getMethodKey( name, signature ) ); | ||
| 346 | } | ||
| 347 | |||
| 348 | public boolean containsArgument( MethodEntry obfMethodEntry, String name ) | ||
| 349 | { | ||
| 350 | MethodMapping methodMapping = m_methodsByObf.get( getMethodKey( obfMethodEntry.getName(), obfMethodEntry.getSignature() ) ); | ||
| 351 | if( methodMapping != null ) | ||
| 352 | { | ||
| 353 | return methodMapping.containsArgument( name ); | ||
| 354 | } | ||
| 355 | return false; | ||
| 356 | } | ||
| 337 | } | 357 | } |
diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 0b03abb0..378d4c0a 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java | |||
| @@ -179,4 +179,39 @@ public class Mappings implements Serializable | |||
| 179 | } | 179 | } |
| 180 | return classNames; | 180 | return classNames; |
| 181 | } | 181 | } |
| 182 | |||
| 183 | public boolean containsDeobfClass( String deobfName ) | ||
| 184 | { | ||
| 185 | return m_classesByDeobf.containsKey( deobfName ); | ||
| 186 | } | ||
| 187 | |||
| 188 | public boolean containsDeobfField( ClassEntry obfClassEntry, String deobfName ) | ||
| 189 | { | ||
| 190 | ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() ); | ||
| 191 | if( classMapping != null ) | ||
| 192 | { | ||
| 193 | return classMapping.containsDeobfField( deobfName ); | ||
| 194 | } | ||
| 195 | return false; | ||
| 196 | } | ||
| 197 | |||
| 198 | public boolean containsDeobfMethod( ClassEntry obfClassEntry, String deobfName, String deobfSignature ) | ||
| 199 | { | ||
| 200 | ClassMapping classMapping = m_classesByObf.get( obfClassEntry.getName() ); | ||
| 201 | if( classMapping != null ) | ||
| 202 | { | ||
| 203 | return classMapping.containsDeobfMethod( deobfName, deobfSignature ); | ||
| 204 | } | ||
| 205 | return false; | ||
| 206 | } | ||
| 207 | |||
| 208 | public boolean containsArgument( MethodEntry obfMethodEntry, String name ) | ||
| 209 | { | ||
| 210 | ClassMapping classMapping = m_classesByObf.get( obfMethodEntry.getClassName() ); | ||
| 211 | if( classMapping != null ) | ||
| 212 | { | ||
| 213 | return classMapping.containsArgument( obfMethodEntry, name ); | ||
| 214 | } | ||
| 215 | return false; | ||
| 216 | } | ||
| 182 | } | 217 | } |
diff --git a/src/cuchaz/enigma/mapping/MethodMapping.java b/src/cuchaz/enigma/mapping/MethodMapping.java index b0f7ba84..bf83bd21 100644 --- a/src/cuchaz/enigma/mapping/MethodMapping.java +++ b/src/cuchaz/enigma/mapping/MethodMapping.java | |||
| @@ -165,4 +165,16 @@ public class MethodMapping implements Serializable, Comparable<MethodMapping> | |||
| 165 | } | 165 | } |
| 166 | return false; | 166 | return false; |
| 167 | } | 167 | } |
| 168 | |||
| 169 | public boolean containsArgument( String name ) | ||
| 170 | { | ||
| 171 | for( ArgumentMapping argumentMapping : m_arguments.values() ) | ||
| 172 | { | ||
| 173 | if( argumentMapping.getName().equals( name ) ) | ||
| 174 | { | ||
| 175 | return true; | ||
| 176 | } | ||
| 177 | } | ||
| 178 | return false; | ||
| 179 | } | ||
| 168 | } | 180 | } |
diff --git a/src/cuchaz/enigma/mapping/Renamer.java b/src/cuchaz/enigma/mapping/Renamer.java index 79cbd30d..15d9af4d 100644 --- a/src/cuchaz/enigma/mapping/Renamer.java +++ b/src/cuchaz/enigma/mapping/Renamer.java | |||
| @@ -13,6 +13,7 @@ package cuchaz.enigma.mapping; | |||
| 13 | import java.io.IOException; | 13 | import java.io.IOException; |
| 14 | import java.io.ObjectOutputStream; | 14 | import java.io.ObjectOutputStream; |
| 15 | import java.io.OutputStream; | 15 | import java.io.OutputStream; |
| 16 | import java.util.Set; | ||
| 16 | import java.util.zip.GZIPOutputStream; | 17 | import java.util.zip.GZIPOutputStream; |
| 17 | 18 | ||
| 18 | import cuchaz.enigma.analysis.JarIndex; | 19 | import cuchaz.enigma.analysis.JarIndex; |
| @@ -31,6 +32,12 @@ public class Renamer | |||
| 31 | public void setClassName( ClassEntry obf, String deobfName ) | 32 | public void setClassName( ClassEntry obf, String deobfName ) |
| 32 | { | 33 | { |
| 33 | deobfName = NameValidator.validateClassName( deobfName ); | 34 | deobfName = NameValidator.validateClassName( deobfName ); |
| 35 | ClassEntry targetEntry = new ClassEntry( deobfName ); | ||
| 36 | if( m_mappings.containsDeobfClass( deobfName ) || m_index.containsObfClass( targetEntry ) ) | ||
| 37 | { | ||
| 38 | throw new IllegalNameException( deobfName, "There is already a class with that name" ); | ||
| 39 | } | ||
| 40 | |||
| 34 | ClassMapping classMapping = getOrCreateClassMapping( obf ); | 41 | ClassMapping classMapping = getOrCreateClassMapping( obf ); |
| 35 | 42 | ||
| 36 | if( obf.isInnerClass() ) | 43 | if( obf.isInnerClass() ) |
| @@ -50,13 +57,32 @@ public class Renamer | |||
| 50 | public void setFieldName( FieldEntry obf, String deobfName ) | 57 | public void setFieldName( FieldEntry obf, String deobfName ) |
| 51 | { | 58 | { |
| 52 | deobfName = NameValidator.validateFieldName( deobfName ); | 59 | deobfName = NameValidator.validateFieldName( deobfName ); |
| 60 | FieldEntry targetEntry = new FieldEntry( obf.getClassEntry(), deobfName ); | ||
| 61 | if( m_mappings.containsDeobfField( obf.getClassEntry(), deobfName ) || m_index.containsObfField( targetEntry ) ) | ||
| 62 | { | ||
| 63 | throw new IllegalNameException( deobfName, "There is already a field with that name" ); | ||
| 64 | } | ||
| 65 | |||
| 53 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); | 66 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 54 | classMapping.setFieldName( obf.getName(), deobfName ); | 67 | classMapping.setFieldName( obf.getName(), deobfName ); |
| 55 | } | 68 | } |
| 56 | 69 | ||
| 57 | public void setMethodTreeName( MethodEntry obf, String deobfName ) | 70 | public void setMethodTreeName( MethodEntry obf, String deobfName ) |
| 58 | { | 71 | { |
| 59 | for( MethodEntry entry : m_index.getRelatedMethodImplementations( obf ) ) | 72 | Set<MethodEntry> implementations = m_index.getRelatedMethodImplementations( obf ); |
| 73 | |||
| 74 | deobfName = NameValidator.validateMethodName( deobfName ); | ||
| 75 | for( MethodEntry entry : implementations ) | ||
| 76 | { | ||
| 77 | MethodEntry targetEntry = new MethodEntry( entry.getClassEntry(), deobfName, entry.getSignature() ); | ||
| 78 | if( m_mappings.containsDeobfMethod( entry.getClassEntry(), deobfName, entry.getSignature() ) || m_index.containsObfMethod( targetEntry ) ) | ||
| 79 | { | ||
| 80 | String className = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateClass( entry.getClassName() ); | ||
| 81 | throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + className ); | ||
| 82 | } | ||
| 83 | } | ||
| 84 | |||
| 85 | for( MethodEntry entry : implementations ) | ||
| 60 | { | 86 | { |
| 61 | setMethodName( entry, deobfName ); | 87 | setMethodName( entry, deobfName ); |
| 62 | } | 88 | } |
| @@ -65,6 +91,13 @@ public class Renamer | |||
| 65 | public void setMethodName( MethodEntry obf, String deobfName ) | 91 | public void setMethodName( MethodEntry obf, String deobfName ) |
| 66 | { | 92 | { |
| 67 | deobfName = NameValidator.validateMethodName( deobfName ); | 93 | deobfName = NameValidator.validateMethodName( deobfName ); |
| 94 | MethodEntry targetEntry = new MethodEntry( obf.getClassEntry(), deobfName, obf.getSignature() ); | ||
| 95 | if( m_mappings.containsDeobfMethod( obf.getClassEntry(), deobfName, obf.getSignature() ) || m_index.containsObfMethod( targetEntry ) ) | ||
| 96 | { | ||
| 97 | String className = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateClass( obf.getClassName() ); | ||
| 98 | throw new IllegalNameException( deobfName, "There is already a method with that name and signature in class " + className ); | ||
| 99 | } | ||
| 100 | |||
| 68 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); | 101 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 69 | String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); | 102 | String deobfSignature = m_mappings.getTranslator( m_index.getAncestries(), TranslationDirection.Deobfuscating ).translateSignature( obf.getSignature() ); |
| 70 | classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); | 103 | classMapping.setMethodNameAndSignature( obf.getName(), obf.getSignature(), deobfName, deobfSignature ); |
| @@ -73,6 +106,12 @@ public class Renamer | |||
| 73 | public void setArgumentName( ArgumentEntry obf, String deobfName ) | 106 | public void setArgumentName( ArgumentEntry obf, String deobfName ) |
| 74 | { | 107 | { |
| 75 | deobfName = NameValidator.validateArgumentName( deobfName ); | 108 | deobfName = NameValidator.validateArgumentName( deobfName ); |
| 109 | // NOTE: don't need to check arguments for name collisions with names determined by Procyon | ||
| 110 | if( m_mappings.containsArgument( obf.getMethodEntry(), deobfName ) ) | ||
| 111 | { | ||
| 112 | throw new IllegalNameException( deobfName, "There is already an argument with that name" ); | ||
| 113 | } | ||
| 114 | |||
| 76 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); | 115 | ClassMapping classMapping = getOrCreateClassMappingOrInnerClassMapping( obf.getClassEntry() ); |
| 77 | classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName ); | 116 | classMapping.setArgumentName( obf.getMethodName(), obf.getMethodSignature(), obf.getIndex(), deobfName ); |
| 78 | } | 117 | } |