Skip to content

Commit 19ba9fe

Browse files
committed
Handle externs
1 parent 1737ba1 commit 19ba9fe

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

javascript/ql/lib/semmle/javascript/endpoints/EndpointNaming.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,18 @@ predicate sinkHasAlias(API::Node sink, string package, string name) {
176176
bindingset[node]
177177
private 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+
179191
bindingset[qualifiedName]
180192
private 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

206220
private 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

319335
private predicate functionHasPrimaryName(

0 commit comments

Comments
 (0)