diff --git a/CHANGELOG.md b/CHANGELOG.md index 234f3fef1..0e174378e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - Exception handling in cache clearing thread - DottedChain.PathPart NoSerializable exception - [#1951] Clearing Namespace/Multiname cache after renaming identifiers +- [#1951] Renaming invalid identifiers with existing string collisions ## [18.3.3] - 2023-01-22 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java index db6cede3b..ee3171c74 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Deobfuscation.java @@ -134,26 +134,26 @@ public class AVM2Deobfuscation { DottedChain newName; if (namesMap.containsKey(sChain)) { newName = namesMap.get(sChain); - constants.setString(strIndex, newName.toRawString()); - } else { - List ret = new ArrayList<>(); - for (int p = 0; p < sChain.size(); p++) { - String part = sChain.get(p); - if (!isValidNSPart(part)) { - ret.add(fooString(namesMap, part, false, "package", renameType)); - } else { - ret.add(part); - } - } - newName = new DottedChain(ret); - namesMap.put(sChain, newName); + return constants.getStringId(newName.toRawString(), true); //constants.setString(strIndex, newName.toRawString()); } + + List ret = new ArrayList<>(); + for (int p = 0; p < sChain.size(); p++) { + String part = sChain.get(p); + if (!isValidNSPart(part)) { + ret.add(fooString(namesMap, part, false, "package", renameType)); + } else { + ret.add(part); + } + } + newName = new DottedChain(ret); + namesMap.put(sChain, newName); + if (stringUsages.contains(strIndex)) { strIndex = constants.addString(newName.toRawString()); } else { constants.setString(strIndex, newName.toRawString()); } - } return strIndex; } @@ -189,10 +189,12 @@ public class AVM2Deobfuscation { DottedChain sChain = DottedChain.parseWithSuffix(s); if (namesMap.containsKey(sChain)) { newname = namesMap.get(sChain); - } else { - String str = fooString(namesMap, constants.getString(strIndex), firstUppercase, stringUsageTypes.get(strIndex), renameType); - newname = DottedChain.parseWithSuffix(str); + return constants.getStringId(newname, true); } + + String str = fooString(namesMap, constants.getString(strIndex), firstUppercase, stringUsageTypes.get(strIndex), renameType); + newname = DottedChain.parseWithSuffix(str); + if (stringUsages.contains(strIndex) || namespaceUsages.contains(strIndex)) { // this name is already referenced as String strIndex = constants.addString(s); // add new index }