From c5994f954ae67458997641d1fcf3a0d677e61ba9 Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 16 Jul 2018 18:16:13 +0300 Subject: [PATCH] core: fix NPE in signature parser (#313) --- .../src/main/java/jadx/core/dex/nodes/ClassNode.java | 12 ++++++------ .../jadx/core/dex/nodes/parser/SignatureParser.java | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 24ab78a42..12b816ad3 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -192,23 +192,23 @@ public class ClassNode extends LineAttrNode implements ILoadable, IDexNode { break; } } - } catch (JadxRuntimeException e) { + } catch (Exception e) { LOG.error("Class signature parse error: {}", this, e); } } private void setFieldsTypesFromSignature() { for (FieldNode field : fields) { - SignatureParser sp = SignatureParser.fromNode(field); - if (sp != null) { - try { + try { + SignatureParser sp = SignatureParser.fromNode(field); + if (sp != null) { ArgType gType = sp.consumeType(); if (gType != null) { field.setType(gType); } - } catch (JadxRuntimeException e) { - LOG.error("Field signature parse error: {}", field, e); } + } catch (Exception e) { + LOG.error("Field signature parse error: {}.{}", this.getFullName(), field.getName(), e); } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java index ebce9cc9e..5b239e158 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/parser/SignatureParser.java @@ -180,6 +180,9 @@ public class SignatureParser { next(); // type parsing not completed, proceed to inner class ArgType inner = consumeObjectType(true); + if (inner == null) { + throw new JadxRuntimeException("No inner type found: " + debugString()); + } return ArgType.genericInner(genericType, inner.getObject(), inner.getGenericTypes()); } else { consume(';'); @@ -289,6 +292,9 @@ public class SignatureParser { } private String debugString() { + if (pos >= sign.length()) { + return sign; + } return sign + " at position " + pos + " ('" + sign.charAt(pos) + "')"; }