Skip to content

Commit 1c22b83

Browse files
committed
[DEX] Detected interned dex items
1 parent 5e91119 commit 1c22b83

6 files changed

Lines changed: 44 additions & 3 deletions

File tree

src/main/java/com/reandroid/common/TextPosition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public String toString() {
5757
if(i == -1) {
5858
builder.append("--");
5959
}else {
60-
builder.append(" line=");
60+
builder.append("line=");
6161
builder.append(i);
6262
}
6363
i = getColumnNumber();

src/main/java/com/reandroid/dex/model/DexLayout.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,10 @@ public void parseSmaliDirectory(File dir) throws IOException {
301301
reader.setOrigin(Origin.createNew(file));
302302
SmaliClass smaliClass = new SmaliClass();
303303
smaliClass.parse(reader);
304+
if (containsClass(smaliClass.getKey())) {
305+
throw new IOException(smaliClass.getOrigin() + " Class: "
306+
+ smaliClass.getKey() + " has already been interned");
307+
}
304308
layout.fromSmali(smaliClass);
305309
}
306310
sort();

src/main/java/com/reandroid/dex/smali/SmaliReader.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.reandroid.common.ByteSource;
1919
import com.reandroid.common.Origin;
2020
import com.reandroid.common.TextPosition;
21+
import com.reandroid.dex.key.Key;
2122
import com.reandroid.utils.HexUtil;
2223
import com.reandroid.utils.NumbersUtil;
2324
import com.reandroid.utils.io.IOUtil;
@@ -26,6 +27,8 @@
2627
import java.io.IOException;
2728
import java.io.InputStream;
2829
import java.nio.charset.StandardCharsets;
30+
import java.util.HashSet;
31+
import java.util.Set;
2932

3033
public class SmaliReader {
3134

@@ -34,6 +37,8 @@ public class SmaliReader {
3437

3538
private Origin origin;
3639

40+
private Set<Key> internedItems;
41+
3742
public SmaliReader(ByteSource byteSource) {
3843
this.byteSource = byteSource;
3944
}
@@ -43,6 +48,7 @@ public SmaliReader(byte[] bytes) {
4348

4449
public void reset() {
4550
this.position(0);
51+
this.internedItems = null;
4652
}
4753
public int position() {
4854
return position;
@@ -448,9 +454,15 @@ public void skip(int amount) {
448454
public Origin getCurrentOrigin() {
449455
return getOrigin(position());
450456
}
457+
public Origin getCurrentOrigin(boolean withDescription) {
458+
return getOrigin(position(), withDescription);
459+
}
451460
public Origin getOrigin(int position) {
461+
return getOrigin(position, true);
462+
}
463+
public Origin getOrigin(int position, boolean withDescription) {
452464
Origin origin = this.getOrigin();
453-
origin = origin.createChild(new SmaliTextPosition(byteSource, position));
465+
origin = origin.createChild(new SmaliTextPosition(byteSource, position, withDescription));
454466
return origin;
455467
}
456468
public Origin getOrigin() {
@@ -464,6 +476,17 @@ public Origin getOrigin() {
464476
public void setOrigin(Origin origin) {
465477
this.origin = origin;
466478
}
479+
public boolean checkInterned(Key key) {
480+
if (key == null) {
481+
return false;
482+
}
483+
Set<Key> internedItems = this.internedItems;
484+
if (internedItems == null) {
485+
internedItems = new HashSet<>();
486+
this.internedItems = internedItems;
487+
}
488+
return !internedItems.add(key);
489+
}
467490

468491
@Override
469492
public String toString() {
@@ -619,10 +642,12 @@ static class SmaliTextPosition extends TextPosition {
619642

620643
private ByteSource byteSource;
621644
private final int position;
645+
private final boolean withDescription;
622646

623-
public SmaliTextPosition(ByteSource byteSource, int position) {
647+
public SmaliTextPosition(ByteSource byteSource, int position, boolean withDescription) {
624648
this.byteSource = byteSource;
625649
this.position = position;
650+
this.withDescription = withDescription;
626651
}
627652

628653
@Override
@@ -662,6 +687,9 @@ private void computeValues() {
662687
this.byteSource = null;
663688
}
664689
private String computePositionDescription(ByteSource byteSource) {
690+
if (!withDescription) {
691+
return null;
692+
}
665693
int pos = this.position;
666694
if (pos >= byteSource.length()) {
667695
return "EOF";

src/main/java/com/reandroid/dex/smali/model/SmaliClass.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public void parse(SmaliReader reader) throws IOException {
184184
reader.skipWhitespacesOrComment();
185185
SmaliParseException.expect(reader, SmaliDirective.CLASS);
186186
setAccessFlags(AccessFlag.parse(reader));
187+
setOrigin(reader.getCurrentOrigin(false));
187188
setKey(TypeKey.read(reader));
188189
while (parseNext(reader)) {
189190
reader.skipWhitespacesOrComment();

src/main/java/com/reandroid/dex/smali/model/SmaliField.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ public void parse(SmaliReader reader) throws IOException {
154154
setName(StringKey.readSimpleName(reader, ':'));
155155
reader.skip(1);
156156
setType(TypeKey.read(reader));
157+
if (reader.checkInterned(getKey())) {
158+
throw new IOException(reader.getCurrentOrigin(false) + " Field "
159+
+ getKey() + " has already been interned");
160+
}
157161
parseValue(reader);
158162
parseAnnotationSet(reader);
159163
}

src/main/java/com/reandroid/dex/smali/model/SmaliMethod.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ public void parse(SmaliReader reader) throws IOException {
164164
setHiddenApiFlags(HiddenApiFlag.parse(reader));
165165
setName(StringKey.readSimpleName(reader, '('));
166166
parseProto(reader);
167+
if (reader.checkInterned(getKey())) {
168+
throw new IOException(reader.getCurrentOrigin(false) + " Method "
169+
+ getKey() + " has already been interned");
170+
}
167171
reader.skipWhitespacesOrComment();
168172
while (parseNoneCode(reader)) {
169173
reader.skipWhitespacesOrComment();

0 commit comments

Comments
 (0)