From fe248d7098611c44cbd62cb2790db4ec537adaed Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 14 Feb 2022 18:25:54 +0000 Subject: [PATCH] fix: check values in inner class annotation (#1382) --- .../dex/sections/DexAnnotationsConvert.java | 17 ++++++++++------ .../annotations/AnnotationsUtils.java | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/annotations/AnnotationsUtils.java diff --git a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/DexAnnotationsConvert.java b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/DexAnnotationsConvert.java index 379e4e785..2f5ea58ee 100644 --- a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/DexAnnotationsConvert.java +++ b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/DexAnnotationsConvert.java @@ -2,7 +2,6 @@ package jadx.plugins.input.dex.sections; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -20,6 +19,7 @@ import jadx.api.plugins.input.data.attributes.types.InnerClassesAttr; import jadx.api.plugins.input.data.attributes.types.InnerClsInfo; import jadx.api.plugins.input.data.attributes.types.SignatureAttr; import jadx.api.plugins.utils.Utils; +import jadx.plugins.input.dex.sections.annotations.AnnotationsUtils; public class DexAnnotationsConvert { private static final Logger LOG = LoggerFactory.getLogger(DexAnnotationsConvert.class); @@ -56,11 +56,16 @@ public class DexAnnotationsConvert { break; case "Ldalvik/annotation/InnerClass;": - Map values = annotation.getValues(); - String name = (String) values.get("name").getValue(); - int accFlags = (Integer) values.get("accessFlags").getValue(); - Map map = Collections.singletonMap(cls, new InnerClsInfo(cls, null, name, accFlags)); - attributes.add(new InnerClassesAttr(map)); + try { + String name = AnnotationsUtils.getValue(annotation, "name", EncodedType.ENCODED_STRING, null); + int accFlags = AnnotationsUtils.getValue(annotation, "accessFlags", EncodedType.ENCODED_INT, 0); + if (name != null || accFlags != 0) { + InnerClsInfo innerClsInfo = new InnerClsInfo(cls, null, name, accFlags); + attributes.add(new InnerClassesAttr(Collections.singletonMap(cls, innerClsInfo))); + } + } catch (Exception e) { + LOG.warn("Failed to parse annotation: " + annotation, e); + } break; case "Ldalvik/annotation/AnnotationDefault;": diff --git a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/annotations/AnnotationsUtils.java b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/annotations/AnnotationsUtils.java new file mode 100644 index 000000000..d64de23f4 --- /dev/null +++ b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/annotations/AnnotationsUtils.java @@ -0,0 +1,20 @@ +package jadx.plugins.input.dex.sections.annotations; + +import jadx.api.plugins.input.data.annotations.EncodedType; +import jadx.api.plugins.input.data.annotations.EncodedValue; +import jadx.api.plugins.input.data.annotations.IAnnotation; + +public class AnnotationsUtils { + + @SuppressWarnings("unchecked") + public static T getValue(IAnnotation ann, String name, EncodedType type, T defValue) { + if (ann == null || ann.getValues() == null || ann.getValues().isEmpty()) { + return defValue; + } + EncodedValue encodedValue = ann.getValues().get(name); + if (encodedValue == null || encodedValue.getType() != type) { + return defValue; + } + return (T) encodedValue.getValue(); + } +}