@@ -5,6 +5,36 @@ private import semmle.code.java.dataflow.DataFlow
5
5
private import semmle.code.java.dataflow.FlowSteps
6
6
private import semmle.code.java.dataflow.ExternalFlow
7
7
8
+ /** The class `androidx.slice.SliceProvider`. */
9
+ class SliceProvider extends Class {
10
+ SliceProvider ( ) { this .hasQualifiedName ( "androidx.slice" , "SliceProvider" ) }
11
+ }
12
+
13
+ /**
14
+ * An additional value step for modeling the lifecycle of a `SliceProvider`.
15
+ * It connects the `PostUpdateNode` of any update done to the provider object in
16
+ * `onCreateSliceProvider` to the instance parameter of `onBindSlice`.
17
+ */
18
+ private class SliceProviderLifecycleStep extends AdditionalValueStep {
19
+ override predicate step ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
20
+ exists ( Method onCreate , Method onBind , RefType declaringClass |
21
+ declaringClass .getASupertype * ( ) instanceof SliceProvider and
22
+ onCreate .getDeclaringType ( ) = declaringClass and
23
+ onCreate .hasName ( "onCreateSliceProvider" ) and
24
+ onBind .getDeclaringType ( ) = declaringClass and
25
+ onBind .hasName ( "onBindSlice" )
26
+ |
27
+ node1
28
+ .( DataFlow:: PostUpdateNode )
29
+ .getPreUpdateNode ( )
30
+ .( DataFlow:: InstanceAccessNode )
31
+ .isOwnInstanceAccess ( ) and
32
+ node1 .getEnclosingCallable ( ) = onCreate and
33
+ node2 .( DataFlow:: InstanceParameterNode ) .getEnclosingCallable ( ) = onBind
34
+ )
35
+ }
36
+ }
37
+
8
38
private class SliceActionsInheritTaint extends DataFlow:: SyntheticFieldContent ,
9
39
TaintInheritingContent {
10
40
SliceActionsInheritTaint ( ) { this .getField ( ) .matches ( "androidx.slice.Slice.action" ) }
0 commit comments