@@ -176,6 +176,18 @@ predicate sinkHasAlias(API::Node sink, string package, string name) {
176176bindingset [ node]
177177private API:: Node getASinkNode ( DataFlow:: SourceNode node ) { result .getAValueReachingSink ( ) = node }
178178
179+ /**
180+ * Holds if `node` is a declaration in an externs file.
181+ *
182+ * This is to ensure that functions/classes in externs are not named after a re-export in a package.
183+ */
184+ private predicate nameFromExterns ( DataFlow:: Node node , string package , string name , int badness ) {
185+ node .getTopLevel ( ) .isExterns ( ) and
186+ package = "global" and
187+ node = AccessPath:: getAnAssignmentTo ( name ) and
188+ badness = - 10
189+ }
190+
179191bindingset [ qualifiedName]
180192private int getBadnessOfClassName ( string qualifiedName ) {
181193 if qualifiedName .matches ( "%.constructor" )
@@ -201,6 +213,8 @@ private predicate classObjectHasNameCandidate(
201213 sinkHasPrimaryName ( getASinkNode ( cls ) , package , name , baseBadness ) and
202214 badness = baseBadness + getBadnessOfClassName ( name )
203215 )
216+ or
217+ nameFromExterns ( cls , package , name , badness )
204218}
205219
206220private predicate classObjectHasPrimaryName (
@@ -314,6 +328,8 @@ private predicate functionHasNameCandidate(
314328 name = join ( baseName , memberName )
315329 )
316330 )
331+ or
332+ nameFromExterns ( function , package , name , badness )
317333}
318334
319335private predicate functionHasPrimaryName (
0 commit comments