Skip to content

Commit eb7d024

Browse files
committed
JS: Global names don't have to be defined in externs
1 parent 493b377 commit eb7d024

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,9 @@ DataFlow::SourceNode nodeReachingSink(API::Node sink) {
187187
private API::Node getASinkNode(DataFlow::SourceNode node) { node = nodeReachingSink(result) }
188188

189189
/**
190-
* Holds if `node` is a declaration in an externs file.
191-
*
192-
* This is to ensure that functions/classes in externs are not named after a re-export in a package.
190+
* Holds if `node` is assigned to a global access path. Note that such nodes generally do not have API nodes.
193191
*/
194-
private predicate nameFromExterns(DataFlow::Node node, string package, string name, int badness) {
195-
node.getTopLevel().isExterns() and
192+
private predicate nameFromGlobal(DataFlow::Node node, string package, string name, int badness) {
196193
package = "global" and
197194
node = AccessPath::getAnAssignmentTo(name) and
198195
badness = -10
@@ -224,7 +221,7 @@ private predicate classObjectHasNameCandidate(
224221
badness = baseBadness + getBadnessOfClassName(name)
225222
)
226223
or
227-
nameFromExterns(cls, package, name, badness)
224+
nameFromGlobal(cls, package, name, badness)
228225
or
229226
// If the class is not accessible via an access path, but instances of the
230227
// class can still escape via more complex access patterns, resort to a synthesized name.
@@ -252,7 +249,7 @@ private predicate sourceNodeHasNameCandidate(
252249
) {
253250
sinkHasPrimaryName(getASinkNode(node), package, name, badness)
254251
or
255-
nameFromExterns(node, package, name, badness)
252+
nameFromGlobal(node, package, name, badness)
256253
or
257254
classObjectHasNameCandidate(node, package, name, badness)
258255
}
@@ -290,7 +287,11 @@ private DataFlow::SourceNode functionValue() {
290287
* Holds if `node` is a function or a call that returns a function.
291288
*/
292289
private predicate isFunctionSource(DataFlow::SourceNode node) {
293-
exists(getASinkNode(node)) and
290+
(
291+
exists(getASinkNode(node))
292+
or
293+
nameFromGlobal(node, _, _, _)
294+
) and
294295
(
295296
node instanceof DataFlow::FunctionNode
296297
or

0 commit comments

Comments
 (0)