@@ -352,8 +352,70 @@ predicate functionHasPrimaryName(DataFlow::FunctionNode function, string package
352
352
functionHasPrimaryName ( function , package , name , _)
353
353
}
354
354
355
+ private predicate sourceNodeHasNameCandidate (
356
+ DataFlow:: SourceNode node , string package , string name , int badness
357
+ ) {
358
+ sinkHasPrimaryName ( getASinkNode ( node ) , package , name , badness )
359
+ or
360
+ functionHasNameCandidate ( node , package , name , badness )
361
+ or
362
+ classObjectHasNameCandidate ( node , package , name , badness )
363
+ }
364
+
365
+ private predicate sourceNodeHasPrimaryName (
366
+ DataFlow:: SourceNode node , string package , string name , int badness
367
+ ) {
368
+ badness = min ( int b | sourceNodeHasNameCandidate ( node , _, _, b ) | b ) and
369
+ package =
370
+ min ( string p | sourceNodeHasNameCandidate ( node , p , _, badness ) | p order by p .length ( ) , p ) and
371
+ name =
372
+ min ( string n | sourceNodeHasNameCandidate ( node , package , n , badness ) | n order by n .length ( ) , n )
373
+ }
374
+
375
+ private predicate sinkHasSourceName ( API:: Node sink , string package , string name , int badness ) {
376
+ exists ( DataFlow:: SourceNode source |
377
+ sink = getASinkNode ( source ) and
378
+ sourceNodeHasPrimaryName ( source , package , name , badness )
379
+ )
380
+ }
381
+
382
+ private predicate sinkHasPrimarySourceName ( API:: Node sink , string package , string name , int badness ) {
383
+ badness = min ( int b | sinkHasSourceName ( sink , _, _, b ) | b ) and
384
+ package = min ( string p | sinkHasSourceName ( sink , p , _, badness ) | p order by p .length ( ) , p ) and
385
+ name = min ( string n | sinkHasSourceName ( sink , package , n , badness ) | n order by n .length ( ) , n )
386
+ }
387
+
388
+ private predicate sinkHasPrimarySourceName ( API:: Node sink , string package , string name ) {
389
+ sinkHasPrimarySourceName ( sink , package , name , _)
390
+ }
391
+
392
+ private predicate aliasCandidate (
393
+ string package , string name , string targetPackage , string targetName , API:: Node aliasDef
394
+ ) {
395
+ sinkHasPrimaryName ( aliasDef , package , name ) and
396
+ sinkHasPrimarySourceName ( aliasDef , targetPackage , targetName ) and
397
+ not (
398
+ package = targetPackage and
399
+ name = targetName
400
+ )
401
+ }
402
+
403
+ private predicate nonAlias ( string package , string name ) {
404
+ // `(package, name)` appears to be an alias for multiple things. Treat it as a primary name instead.
405
+ strictcount ( string targetPackage , string targetName |
406
+ aliasCandidate ( package , name , targetPackage , targetName , _)
407
+ ) > 1
408
+ or
409
+ // Not all sinks with this name agree on the alias target
410
+ exists ( API:: Node sink , string targetPackage , string targetName |
411
+ aliasCandidate ( package , name , targetPackage , targetName , _) and
412
+ sinkHasPrimaryName ( sink , package , name ) and
413
+ not sinkHasPrimarySourceName ( sink , targetPackage , targetName , _)
414
+ )
415
+ }
416
+
355
417
/**
356
- * Holds if `(aliasPackage, aliasName )` is an alias for `(primaryPackage, primaryName )`,
418
+ * Holds if `(package, name )` is an alias for `(targetPackage, targetName )`,
357
419
* defined at `aliasDef`.
358
420
*
359
421
* Only the last component of an access path is reported as an alias, the prefix always
@@ -365,24 +427,10 @@ predicate functionHasPrimaryName(DataFlow::FunctionNode function, string package
365
427
* reported separately.
366
428
*/
367
429
predicate aliasDefinition (
368
- string primaryPackage , string primaryName , string aliasPackage , string aliasName ,
369
- API:: Node aliasDef
430
+ string package , string name , string targetPackage , string targetName , API:: Node aliasDef
370
431
) {
371
- exists ( DataFlow:: SourceNode source |
372
- classObjectHasPrimaryName ( source , primaryPackage , primaryName )
373
- or
374
- functionHasPrimaryName ( source , primaryPackage , primaryName )
375
- |
376
- aliasDef .getAValueReachingSink ( ) = source and
377
- sinkHasPrimaryName ( aliasDef , aliasPackage , aliasName , _) and
378
- not (
379
- primaryPackage = aliasPackage and
380
- primaryName = aliasName
381
- )
382
- )
383
- or
384
- sinkHasPrimaryName ( aliasDef , primaryPackage , primaryName ) and
385
- sinkHasAlias ( aliasDef , aliasPackage , aliasName )
432
+ aliasCandidate ( package , name , targetPackage , targetName , aliasDef ) and
433
+ not nonAlias ( package , name )
386
434
}
387
435
388
436
/**
0 commit comments