@@ -1534,15 +1534,36 @@ private module StdlibPrivate {
1534
1534
// ---------------------------------------------------------------------------
1535
1535
// hashlib
1536
1536
// ---------------------------------------------------------------------------
1537
+ /** Gets a back-reference to the hashname argument `arg` that was used in a call to `hashlib.new`. */
1538
+ private DataFlow:: TypeTrackingNode hashlibNewCallNameBacktracker (
1539
+ DataFlow:: TypeBackTracker t , DataFlow:: Node arg
1540
+ ) {
1541
+ t .start ( ) and
1542
+ hashlibNewCallImpl ( _, arg ) and
1543
+ result = arg .getALocalSource ( )
1544
+ or
1545
+ exists ( DataFlow:: TypeBackTracker t2 |
1546
+ result = hashlibNewCallNameBacktracker ( t2 , arg ) .backtrack ( t2 , t )
1547
+ )
1548
+ }
1549
+
1550
+ /** Gets a back-reference to the hashname argument `arg` that was used in a call to `hashlib.new`. */
1551
+ private DataFlow:: LocalSourceNode hashlibNewCallNameBacktracker ( DataFlow:: Node arg ) {
1552
+ result = hashlibNewCallNameBacktracker ( DataFlow:: TypeBackTracker:: end ( ) , arg )
1553
+ }
1554
+
1555
+ /** Holds when `call` is a call to `hashlib.new` with `nameArg` as the first argument. */
1556
+ private predicate hashlibNewCallImpl ( DataFlow:: CallCfgNode call , DataFlow:: Node nameArg ) {
1557
+ call = API:: moduleImport ( "hashlib" ) .getMember ( "new" ) .getACall ( ) and
1558
+ nameArg in [ call .getArg ( 0 ) , call .getArgByName ( "name" ) ]
1559
+ }
1560
+
1537
1561
/** Gets a call to `hashlib.new` with `algorithmName` as the first argument. */
1538
1562
private DataFlow:: CallCfgNode hashlibNewCall ( string algorithmName ) {
1539
- exists ( DataFlow:: Node nameArg |
1540
- result = API:: moduleImport ( "hashlib" ) .getMember ( "new" ) .getACall ( ) and
1541
- nameArg in [ result .getArg ( 0 ) , result .getArgByName ( "name" ) ] and
1542
- exists ( StrConst str |
1543
- nameArg .getALocalSource ( ) = DataFlow:: exprNode ( str ) and
1544
- algorithmName = str .getText ( )
1545
- )
1563
+ exists ( DataFlow:: Node origin , DataFlow:: Node nameArg |
1564
+ origin = hashlibNewCallNameBacktracker ( nameArg ) and
1565
+ algorithmName = origin .asExpr ( ) .( StrConst ) .getText ( ) and
1566
+ hashlibNewCallImpl ( result , nameArg )
1546
1567
)
1547
1568
}
1548
1569
0 commit comments