From d5f42662835a861064564bebbe26a514cd3430fa Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Fri, 22 Mar 2019 08:55:44 +0100 Subject: [PATCH] fix: rename class with reserved java keywords (#485) (PR #488) --- .../jadx/core/dex/visitors/RenameVisitor.java | 3 +++ .../names/TestReservedClassNames.java | 27 +++++++++++++++++++ .../smali/names/TestReservedClassNames.smali | 12 +++++++++ 3 files changed, 42 insertions(+) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java create mode 100644 jadx-core/src/test/smali/names/TestReservedClassNames.smali diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java index 4f91ed490..77822451f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java @@ -92,6 +92,9 @@ public class RenameVisitor extends AbstractVisitor { if (firstChar == '$') { return 'C' + NameMapper.removeInvalidCharsMiddle(clsName); } + if (!NameMapper.isValidIdentifier(clsName)) { + return 'C' + clsName; + } return NameMapper.removeInvalidChars(clsName, "C"); } diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java new file mode 100644 index 000000000..b29baa63f --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedClassNames.java @@ -0,0 +1,27 @@ +package jadx.tests.integration.names; + +import org.junit.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + +import java.io.File; + +public class TestReservedClassNames extends SmaliTest { + /* + public class do { + } + */ + + @Test + public void test() { + ClassNode cls = getClassNodeFromSmali("names" + File.separatorChar + "TestReservedClassNames", "do"); + String code = cls.getCode().toString(); + + assertThat(code, not(containsString("public class do"))); + } +} diff --git a/jadx-core/src/test/smali/names/TestReservedClassNames.smali b/jadx-core/src/test/smali/names/TestReservedClassNames.smali new file mode 100644 index 000000000..b5dadcccc --- /dev/null +++ b/jadx-core/src/test/smali/names/TestReservedClassNames.smali @@ -0,0 +1,12 @@ +.class public Ldo; +.super Ljava/lang/Object; + +# direct methods +.method public constructor ()V + .locals 0 + + .line 3 + invoke-direct {p0}, Ljava/lang/Object;->()V + + return-void +.end method