Skip to content

Commit db58f7f

Browse files
committed
Address PR comments
1 parent ddd2f00 commit db58f7f

File tree

2 files changed

+54
-24
lines changed

2 files changed

+54
-24
lines changed

soot-infoflow-android/src/soot/jimple/infoflow/android/entryPointCreators/AndroidEntryPointCreator.java

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import soot.jimple.Jimple;
4343
import soot.jimple.NopStmt;
4444
import soot.jimple.NullConstant;
45-
import soot.jimple.StaticFieldRef;
4645
import soot.jimple.Stmt;
4746
import soot.jimple.infoflow.android.entryPointCreators.AndroidEntryPointUtils.ComponentType;
4847
import soot.jimple.infoflow.android.entryPointCreators.components.AbstractComponentEntryPointCreator;
@@ -345,22 +344,18 @@ private void createJavascriptCallbacks() {
345344
Set<Stmt> statements = javascriptInterfaceStmts.get(m);
346345
for (Stmt s : statements) {
347346
UnitPatchingChain units = m.retrieveActiveBody().getUnits();
348-
Stmt succ = (Stmt) units.getSuccOf(s);
349347
SootField f = null;
350348
Value arg = s.getInvokeExpr().getArg(0);
351-
if (succ.getTag(SimulatedCodeElementTag.TAG_NAME) != null) {
352-
if (succ instanceof AssignStmt) {
353-
AssignStmt assign = (AssignStmt) succ;
354-
if (assign.getRightOp() == arg && assign.getLeftOp() instanceof StaticFieldRef) {
355-
f = ((StaticFieldRef) assign.getLeftOp()).getField();
356-
}
357-
}
349+
DummyMainFieldElementTag dm = (DummyMainFieldElementTag) s.getTag(DummyMainFieldElementTag.TAG_NAME);
350+
if (dm != null) {
351+
f = mainMethod.getDeclaringClass().getFieldByNameUnsafe(dm.getFieldName());
358352
}
359353
if (f == null) {
360354
//create field
361355
f = createField(arg.getType(), "jsInterface");
362356
AssignStmt assign = j.newAssignStmt(j.newStaticFieldRef(f.makeRef()), arg);
363357
assign.addTag(SimulatedCodeElementTag.TAG);
358+
s.addTag(new DummyMainFieldElementTag(f.getName()));
364359
units.insertAfter(assign, s);
365360
}
366361

@@ -369,21 +364,15 @@ private void createJavascriptCallbacks() {
369364
Stmt assignF = j.newAssignStmt(l, j.newStaticFieldRef(f.makeRef()));
370365
body.getUnits().add(assignF);
371366
SootClass cbtype = ((RefType) f.getType()).getSootClass();
372-
List<SootClass> allPossibleImpls;
373-
if (cbtype.isInterface()) {
374-
allPossibleImpls = h.getImplementersOf(cbtype);
375-
} else {
376-
allPossibleImpls = h.getSubclassesOfIncluding(cbtype);
377-
}
378-
for (SootClass c : allPossibleImpls) {
379-
for (SootMethod cbm : c.getMethods()) {
380-
if (AndroidEntryPointUtils.isCallableFromJS(cbm)) {
381-
List<Value> args = new ArrayList<>();
382-
for (Type t : cbm.getParameterTypes())
383-
args.add(getSimpleDefaultValue(t));
384-
InvokeStmt st = j.newInvokeStmt(j.newVirtualInvokeExpr(l, cbm.makeRef(), args));
385-
body.getUnits().add(st);
386-
}
367+
Set<SootMethod> allPossibleImpls = Scene.v().getOrMakeFastHierarchy().resolveAbstractDispatch(cbtype,
368+
m);
369+
for (SootMethod cbm : allPossibleImpls) {
370+
if (AndroidEntryPointUtils.isCallableFromJS(cbm)) {
371+
List<Value> args = new ArrayList<>();
372+
for (Type t : cbm.getParameterTypes())
373+
args.add(getSimpleDefaultValue(t));
374+
InvokeStmt st = j.newInvokeStmt(j.newVirtualInvokeExpr(l, cbm.makeRef(), args));
375+
body.getUnits().add(st);
387376
}
388377
}
389378
createIfStmt(assignF);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package soot.jimple.infoflow.android.entryPointCreators;
2+
3+
import soot.tagkit.AttributeValueException;
4+
import soot.tagkit.Tag;
5+
6+
/**
7+
* Tag to denote that a certain method or class was created by an entry point
8+
* creator and should not be considered real app code
9+
*
10+
* @author Steven Arzt
11+
*
12+
*/
13+
public class DummyMainFieldElementTag implements Tag {
14+
15+
public static final String TAG_NAME = "DummyMainFieldElementTag";
16+
public static DummyMainFieldElementTag TAG = new DummyMainFieldElementTag();
17+
private String fieldName;
18+
19+
private DummyMainFieldElementTag() {
20+
//
21+
}
22+
23+
public DummyMainFieldElementTag(String name) {
24+
this.fieldName = name;
25+
}
26+
27+
public String getFieldName() {
28+
return fieldName;
29+
}
30+
31+
@Override
32+
public String getName() {
33+
return TAG_NAME;
34+
}
35+
36+
@Override
37+
public byte[] getValue() throws AttributeValueException {
38+
return null;
39+
}
40+
41+
}

0 commit comments

Comments
 (0)