Skip to content

Commit 83989cf

Browse files
committed
Make sure to get all possible types
1 parent db58f7f commit 83989cf

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.slf4j.LoggerFactory;
2525

2626
import soot.Body;
27-
import soot.Hierarchy;
2827
import soot.Local;
2928
import soot.Modifier;
3029
import soot.RefType;
@@ -58,6 +57,7 @@
5857
import soot.jimple.infoflow.data.SootMethodAndClass;
5958
import soot.jimple.infoflow.entryPointCreators.IEntryPointCreator;
6059
import soot.jimple.infoflow.entryPointCreators.SimulatedCodeElementTag;
60+
import soot.jimple.infoflow.typing.TypeUtils;
6161
import soot.jimple.infoflow.util.SootMethodRepresentationParser;
6262
import soot.jimple.infoflow.util.SystemClassHandler;
6363
import soot.jimple.toolkits.scalar.NopEliminator;
@@ -339,7 +339,6 @@ protected SootMethod createDummyMainInternal() {
339339

340340
private void createJavascriptCallbacks() {
341341
Jimple j = Jimple.v();
342-
Hierarchy h = Scene.v().getActiveHierarchy();
343342
for (SootMethod m : javascriptInterfaceStmts.keySet()) {
344343
Set<Stmt> statements = javascriptInterfaceStmts.get(m);
345344
for (Stmt s : statements) {
@@ -364,16 +363,18 @@ private void createJavascriptCallbacks() {
364363
Stmt assignF = j.newAssignStmt(l, j.newStaticFieldRef(f.makeRef()));
365364
body.getUnits().add(assignF);
366365
SootClass cbtype = ((RefType) f.getType()).getSootClass();
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);
366+
367+
for (SootClass c : TypeUtils.getAllDerivedClasses(cbtype)) {
368+
for (SootMethod cbm : c.getMethods()) {
369+
if (AndroidEntryPointUtils.isCallableFromJS(cbm)) {
370+
List<Value> args = new ArrayList<>();
371+
for (Type t : cbm.getParameterTypes())
372+
args.add(getSimpleDefaultValue(t));
373+
InvokeStmt st = j.newInvokeStmt(j.newVirtualInvokeExpr(l, cbm.makeRef(), args));
374+
body.getUnits().add(st);
375+
}
376376
}
377+
377378
}
378379
createIfStmt(assignF);
379380

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ private static Collection<? extends MethodOrMethodContext> getLifecycleMethods(S
291291
* @return true if the method is pot. callable from JS
292292
*/
293293
public static boolean isCallableFromJS(SootMethod m) {
294-
if (!m.isPublic() || m.isStatic())
294+
if (!m.isPublic() || m.isStatic() || m.isAbstract())
295295
return false;
296296

297297
for (Tag tag : m.getTags()) {

0 commit comments

Comments
 (0)