@@ -249,88 +249,91 @@ class GrantWriteUriPermissionFlag extends GrantUriPermissionFlag {
249
249
GrantWriteUriPermissionFlag ( ) { this .hasName ( "FLAG_GRANT_WRITE_URI_PERMISSION" ) }
250
250
}
251
251
252
+ /** The instantiation of an `android.content.Intent` instance. */
253
+ private class NewIntent extends ClassInstanceExpr {
254
+ NewIntent ( ) { this .getConstructedType ( ) instanceof TypeIntent }
255
+
256
+ /** Gets the `Class<?>` argument of this call. */
257
+ Argument getClassArg ( ) {
258
+ result .getType ( ) instanceof TypeClass and
259
+ result = this .getAnArgument ( )
260
+ }
261
+ }
262
+
263
+ /** A call to a method that starts an Android component */
264
+ private class StartComponentMethodAccess extends MethodAccess {
265
+ StartComponentMethodAccess ( ) {
266
+ this .getMethod ( ) .overrides * ( any ( StartActivityMethod m ) ) or
267
+ this .getMethod ( ) .overrides * ( any ( StartServiceMethod m ) ) or
268
+ this .getMethod ( ) .overrides * ( any ( SendBroadcastMethod m ) )
269
+ }
270
+
271
+ /** Gets the intent argument of this call. */
272
+ Argument getIntentArg ( ) {
273
+ result .getType ( ) instanceof TypeIntent and
274
+ result = this .getAnArgument ( )
275
+ }
276
+
277
+ /** Holds if this targets a component of type `targetType`. */
278
+ predicate targetsComponentType ( RefType targetType ) {
279
+ exists ( NewIntent newIntent |
280
+ DataFlow:: localExprFlow ( newIntent , this .getIntentArg ( ) ) and
281
+ newIntent .getClassArg ( ) .getType ( ) .( ParameterizedType ) .getATypeArgument ( ) = targetType
282
+ )
283
+ }
284
+ }
285
+
252
286
/**
253
- * Gets the `Class<?>` argument of an `android.content.Intent`constructor.
254
- *
255
- * The `android.content.Intent` class has two constructors with an argument of type
256
- * `Class<?>`. One has the argument at position 1 and the other at position 3.
257
- * https://developer.android.com/reference/android/content/Intent#public-constructors
287
+ * Holds if there is a step from the intent argument `n1` of a `startActivity` call
288
+ * to a `getIntent` call `n2` in the activity `n1` targets.
258
289
*/
259
- private Argument getClassArgOfIntentConstructor ( ClassInstanceExpr classInstanceExpr ) {
260
- classInstanceExpr .getConstructedType ( ) instanceof TypeIntent and
261
- if classInstanceExpr .getNumArgument ( ) = 2
262
- then result = classInstanceExpr .getArgument ( 1 )
263
- else result = classInstanceExpr .getArgument ( 3 )
290
+ private predicate startActivityIntentStep ( DataFlow:: Node n1 , DataFlow:: Node n2 ) {
291
+ exists ( StartComponentMethodAccess startActivity , MethodAccess getIntent |
292
+ startActivity .getMethod ( ) .overrides * ( any ( StartActivityMethod m ) ) and
293
+ getIntent .getMethod ( ) .overrides * ( any ( AndroidGetIntentMethod m ) ) and
294
+ startActivity .targetsComponentType ( getIntent .getReceiverType ( ) ) and
295
+ n1 .asExpr ( ) = startActivity .getIntentArg ( ) and
296
+ n2 .asExpr ( ) = getIntent
297
+ )
264
298
}
265
299
266
300
/**
267
- * A value-preserving step from the Intent argument of a `startActivity` call to
268
- * a `getIntent` call in the Activity the Intent pointed to in its constructor.
301
+ * A value-preserving step from the intent argument of a `startActivity` call to
302
+ * a `getIntent` call in the activity the intent targeted in its constructor.
269
303
*/
270
304
private class StartActivityIntentStep extends AdditionalValueStep {
271
- /**
272
- * Gets the `Intent` argument of an Android `StartActivityMethod`.
273
- *
274
- * The `startActivityFromChild` and `startActivityFromFragment` methods have
275
- * an argument of type `Intent` at position 1, but the rest of the methods of
276
- * type `StartActivityMethod` have an argument of type `Intent` at position 0.
277
- */
278
- private Argument getIntentArgOfStartActMethod ( MethodAccess methodAccess ) {
279
- methodAccess .getMethod ( ) .overrides * ( any ( StartActivityMethod m ) ) and
280
- if methodAccess .getMethod ( ) .hasName ( [ "startActivityFromChild" , "startActivityFromFragment" ] )
281
- then result = methodAccess .getArgument ( 1 )
282
- else result = methodAccess .getArgument ( 0 )
283
- }
284
-
285
- override predicate step ( DataFlow:: Node n1 , DataFlow:: Node n2 ) {
286
- exists ( MethodAccess startActivity , MethodAccess getIntent , ClassInstanceExpr newIntent |
287
- startActivity .getMethod ( ) .overrides * ( any ( StartActivityMethod m ) ) and
288
- getIntent .getMethod ( ) .overrides * ( any ( AndroidGetIntentMethod m ) ) and
289
- newIntent .getConstructedType ( ) instanceof TypeIntent and
290
- DataFlow:: localExprFlow ( newIntent , this .getIntentArgOfStartActMethod ( startActivity ) ) and
291
- getClassArgOfIntentConstructor ( newIntent ) .getType ( ) .( ParameterizedType ) .getATypeArgument ( ) =
292
- getIntent .getReceiverType ( ) and
293
- n1 .asExpr ( ) = this .getIntentArgOfStartActMethod ( startActivity ) and
294
- n2 .asExpr ( ) = getIntent
295
- )
296
- }
305
+ override predicate step ( DataFlow:: Node n1 , DataFlow:: Node n2 ) { startActivityIntentStep ( n1 , n2 ) }
297
306
}
298
307
299
308
/**
300
- * A value-preserving step from the Intent argument of a `sendBroadcast` call to
301
- * the `Intent` parameter in the `onReceive` method of the BroadcastReceiver the
302
- * Intent pointed to in its constructor.
309
+ * A value-preserving step from the intent argument of a `sendBroadcast` call to
310
+ * the intent parameter in the `onReceive` method of the receiver the
311
+ * intent targeted in its constructor.
303
312
*/
304
313
private class SendBroadcastReceiverIntentStep extends AdditionalValueStep {
305
314
override predicate step ( DataFlow:: Node n1 , DataFlow:: Node n2 ) {
306
- exists ( MethodAccess sendBroadcast , Method onReceive , ClassInstanceExpr newIntent |
315
+ exists ( StartComponentMethodAccess sendBroadcast , Method onReceive |
307
316
sendBroadcast .getMethod ( ) .overrides * ( any ( SendBroadcastMethod m ) ) and
308
317
onReceive .overrides * ( any ( AndroidReceiveIntentMethod m ) ) and
309
- newIntent .getConstructedType ( ) instanceof TypeIntent and
310
- DataFlow:: localExprFlow ( newIntent , sendBroadcast .getArgument ( 0 ) ) and
311
- getClassArgOfIntentConstructor ( newIntent ) .getType ( ) .( ParameterizedType ) .getATypeArgument ( ) =
312
- onReceive .getDeclaringType ( ) and
313
- n1 .asExpr ( ) = sendBroadcast .getArgument ( 0 ) and
318
+ sendBroadcast .targetsComponentType ( onReceive .getDeclaringType ( ) ) and
319
+ n1 .asExpr ( ) = sendBroadcast .getIntentArg ( ) and
314
320
n2 .asParameter ( ) = onReceive .getParameter ( 1 )
315
321
)
316
322
}
317
323
}
318
324
319
325
/**
320
- * A value-preserving step from the Intent argument of a `startService` call to
321
- * the `Intent` parameter in an `AndroidServiceIntentMethod` of the Service the
322
- * Intent pointed to in its constructor.
326
+ * A value-preserving step from the intent argument of a `startService` call to
327
+ * the intent parameter in an `AndroidServiceIntentMethod` of the service the
328
+ * intent targeted in its constructor.
323
329
*/
324
330
private class StartServiceIntentStep extends AdditionalValueStep {
325
331
override predicate step ( DataFlow:: Node n1 , DataFlow:: Node n2 ) {
326
- exists ( MethodAccess startService , Method serviceIntent , ClassInstanceExpr newIntent |
332
+ exists ( StartComponentMethodAccess startService , Method serviceIntent |
327
333
startService .getMethod ( ) .overrides * ( any ( StartServiceMethod m ) ) and
328
334
serviceIntent .overrides * ( any ( AndroidServiceIntentMethod m ) ) and
329
- newIntent .getConstructedType ( ) instanceof TypeIntent and
330
- DataFlow:: localExprFlow ( newIntent , startService .getArgument ( 0 ) ) and
331
- getClassArgOfIntentConstructor ( newIntent ) .getType ( ) .( ParameterizedType ) .getATypeArgument ( ) =
332
- serviceIntent .getDeclaringType ( ) and
333
- n1 .asExpr ( ) = startService .getArgument ( 0 ) and
335
+ startService .targetsComponentType ( serviceIntent .getDeclaringType ( ) ) and
336
+ n1 .asExpr ( ) = startService .getIntentArg ( ) and
334
337
n2 .asParameter ( ) = serviceIntent .getParameter ( 0 )
335
338
)
336
339
}
0 commit comments