11package soot .jimple .infoflow .methodSummary .taintWrappers ;
22
3+ import java .io .IOException ;
4+ import java .net .URISyntaxException ;
35import java .util .ArrayList ;
46import java .util .Arrays ;
57import java .util .Collection ;
6062import soot .jimple .infoflow .data .ContainerContext ;
6163import soot .jimple .infoflow .data .SootMethodAndClass ;
6264import soot .jimple .infoflow .handlers .PreAnalysisHandler ;
65+ import soot .jimple .infoflow .methodSummary .data .provider .EagerSummaryProvider ;
6366import soot .jimple .infoflow .methodSummary .data .provider .IMethodSummaryProvider ;
6467import soot .jimple .infoflow .methodSummary .data .sourceSink .AbstractFlowSinkSource ;
6568import soot .jimple .infoflow .methodSummary .data .sourceSink .ConstraintType ;
@@ -235,7 +238,8 @@ protected void handleFlowBackFromGap(Unit u, Abstraction d2, Set<AccessPathPropa
235238 for (AccessPathPropagator propagator : propagators ) {
236239 // Propagate these taints up. We leave the current gap
237240 AccessPathPropagator parent = safePopParent (propagator );
238- GapDefinition parentGap = propagator .getParent () == null ? null : propagator .getParent ().getGap ();
241+ final AccessPathPropagator pparent = propagator .getParent ();
242+ GapDefinition parentGap = pparent == null ? null : pparent .getGap ();
239243
240244 // Create taints from the abstractions
241245 Set <Taint > returnTaints = createTaintFromAccessPathOnReturn (d2 .getAccessPath (), (Stmt ) u ,
@@ -250,10 +254,16 @@ protected void handleFlowBackFromGap(Unit u, Abstraction d2, Set<AccessPathPropa
250254 // Create the new propagator, one for every taint
251255 Set <AccessPathPropagator > workSet = new HashSet <>();
252256 for (Taint returnTaint : returnTaints ) {
253- AccessPathPropagator newPropagator = new AccessPathPropagator (returnTaint , parentGap , parent ,
254- propagator .getParent () == null ? null : propagator .getParent ().getStmt (),
255- propagator .getParent () == null ? null : propagator .getParent ().getD1 (),
256- propagator .getParent () == null ? null : propagator .getParent ().getD2 ());
257+ Stmt stmt = null ;
258+ Abstraction d1 = null ;
259+ Abstraction nd2 = null ;
260+ if (pparent != null ) {
261+ stmt = pparent .getStmt ();
262+ d1 = pparent .getD1 ();
263+ nd2 = pparent .getD2 ();
264+ }
265+ AccessPathPropagator newPropagator = new AccessPathPropagator (returnTaint , parentGap , parent , stmt ,
266+ d1 , nd2 );
257267 workSet .add (newPropagator );
258268 }
259269
@@ -335,9 +345,10 @@ private AccessPathPropagator getOriginalCallSite(AccessPathPropagator propagator
335345 // Get the original call site
336346 AccessPathPropagator curProp = propagator ;
337347 while (curProp != null ) {
338- if (curProp .getParent () == null )
348+ final AccessPathPropagator parent = curProp .getParent ();
349+ if (parent == null )
339350 return curProp ;
340- curProp = curProp . getParent () ;
351+ curProp = parent ;
341352 }
342353 return null ;
343354 }
@@ -354,6 +365,14 @@ public SummaryTaintWrapper(IMethodSummaryProvider flows) {
354365 setContainerStrategyFactory (new DefaultConfigContainerStrategyFactory ());
355366 }
356367
368+ /**
369+ * Creates a new instance of the {@link SummaryTaintWrapper} class.
370+ * Uses summaries present within the StubDroid JAR file.
371+ */
372+ public SummaryTaintWrapper () throws URISyntaxException , IOException {
373+ this (new EagerSummaryProvider ());
374+ }
375+
357376 /**
358377 * Sets the container strategy factory.
359378 *
@@ -1105,7 +1124,8 @@ protected Set<AccessPathPropagator> spawnAnalysisIntoClientCode(SootMethod imple
11051124
11061125 // We need to pop the last gap element off the stack
11071126 AccessPathPropagator parent = safePopParent (propagator );
1108- GapDefinition gap = propagator .getParent () == null ? null : propagator .getParent ().getGap ();
1127+ AccessPathPropagator pparent = propagator .getParent ();
1128+ GapDefinition gap = pparent == null ? null : pparent .getGap ();
11091129
11101130 // We might already have a summary for the callee
11111131 Set <AccessPathPropagator > outgoingTaints = null ;
@@ -1122,10 +1142,16 @@ protected Set<AccessPathPropagator> spawnAnalysisIntoClientCode(SootMethod imple
11221142 propagator .getGap ());
11231143 if (newTaints != null ) {
11241144 for (Taint newTaint : newTaints ) {
1125- AccessPathPropagator newPropagator = new AccessPathPropagator (newTaint , gap , parent ,
1126- propagator .getParent () == null ? null : propagator .getParent ().getStmt (),
1127- propagator .getParent () == null ? null : propagator .getParent ().getD1 (),
1128- propagator .getParent () == null ? null : propagator .getParent ().getD2 ());
1145+ Stmt nstmt = null ;
1146+ Abstraction d1 = null ;
1147+ Abstraction d2 = null ;
1148+ if (pparent != null ) {
1149+ nstmt = pparent .getStmt ();
1150+ d1 = pparent .getD1 ();
1151+ d2 = pparent .getD2 ();
1152+ }
1153+ AccessPathPropagator newPropagator = new AccessPathPropagator (newTaint , gap , parent , nstmt ,
1154+ d1 , d2 );
11291155 outgoingTaints .add (newPropagator );
11301156 }
11311157 }
@@ -1147,9 +1173,10 @@ protected Set<AccessPathPropagator> spawnAnalysisIntoClientCode(SootMethod imple
11471173 }
11481174
11491175 protected AccessPathPropagator safePopParent (AccessPathPropagator curPropagator ) {
1150- if (curPropagator .getParent () == null )
1176+ AccessPathPropagator parent = curPropagator .getParent ();
1177+ if (parent == null )
11511178 return null ;
1152- return curPropagator . getParent () .getParent ();
1179+ return parent .getParent ();
11531180 }
11541181
11551182 /**
@@ -1382,10 +1409,18 @@ protected AccessPathPropagator applyFlow(MethodFlow flow, AccessPathPropagator p
13821409 taintGap = null ;
13831410 } else {
13841411 parent = safePopParent (propagator );
1385- gap = propagator .getParent () == null ? null : propagator .getParent ().getGap ();
1386- stmt = propagator .getParent () == null ? propagator .getStmt () : propagator .getParent ().getStmt ();
1387- d1 = propagator .getParent () == null ? propagator .getD1 () : propagator .getParent ().getD1 ();
1388- d2 = propagator .getParent () == null ? propagator .getD2 () : propagator .getParent ().getD2 ();
1412+ AccessPathPropagator pparent = propagator .getParent ();
1413+ if (pparent == null ) {
1414+ gap = null ;
1415+ stmt = propagator .getStmt ();
1416+ d1 = propagator .getD1 ();
1417+ d2 = propagator .getD2 ();
1418+ } else {
1419+ gap = pparent .getGap ();
1420+ stmt = pparent .getStmt ();
1421+ d1 = pparent .getD1 ();
1422+ d2 = pparent .getD2 ();
1423+ }
13891424 taintGap = propagator .getGap ();
13901425 }
13911426
0 commit comments