Skip to content

Commit ff62c56

Browse files
author
Max Schaefer
committed
JavaScript: Replace remaining uses of TrackedExpr with type tracking.
1 parent 0d4ff2d commit ff62c56

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

javascript/ql/src/semmle/javascript/frameworks/Express.qll

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ module Express {
657657
/**
658658
* An Express server application.
659659
*/
660-
private class Application extends HTTP::ServerDefinition, DataFlow::TrackedExpr {
660+
private class Application extends HTTP::ServerDefinition {
661661
Application() { this = appCreation().asExpr() }
662662

663663
/**
@@ -671,9 +671,23 @@ module Express {
671671
/**
672672
* An Express router.
673673
*/
674-
class RouterDefinition extends InvokeExpr, DataFlow::TrackedExpr {
674+
class RouterDefinition extends InvokeExpr {
675675
RouterDefinition() { this = routerCreation().asExpr() }
676676

677+
private DataFlow::SourceNode ref(DataFlow::TypeTracker t) {
678+
t.start() and
679+
result = DataFlow::exprNode(this)
680+
or
681+
exists(DataFlow::TypeTracker t2 | result = ref(t2).track(t2, t))
682+
}
683+
684+
/**
685+
* Holds if `sink` may refer to this router.
686+
*/
687+
predicate flowsTo(Expr sink) {
688+
ref(DataFlow::TypeTracker::end()).flowsToExpr(sink)
689+
}
690+
677691
/**
678692
* Gets a `RouteSetup` that was used for setting up a route on this router.
679693
*/

javascript/ql/src/semmle/javascript/frameworks/HTTP.qll

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,20 @@ module HTTP {
248248
/**
249249
* A standard server definition.
250250
*/
251-
abstract class StandardServerDefinition extends ServerDefinition, DataFlow::TrackedExpr {
251+
abstract class StandardServerDefinition extends ServerDefinition {
252252
override RouteHandler getARouteHandler() { result.(StandardRouteHandler).getServer() = this }
253+
254+
private DataFlow::SourceNode ref(DataFlow::TypeTracker t) {
255+
t.start() and
256+
result = DataFlow::exprNode(this)
257+
or
258+
exists(DataFlow::TypeTracker t2 | result = ref(t2).track(t2, t))
259+
}
260+
261+
/**
262+
* Holds if `sink` may refer to this server definition.
263+
*/
264+
predicate flowsTo(Expr sink) { ref(DataFlow::TypeTracker::end()).flowsToExpr(sink) }
253265
}
254266

255267
/**

javascript/ql/src/semmle/javascript/frameworks/Restify.qll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ module Restify {
99
/**
1010
* An expression that creates a new Restify server.
1111
*/
12-
class ServerDefinition extends HTTP::Servers::StandardServerDefinition, CallExpr,
13-
DataFlow::TrackedExpr {
12+
class ServerDefinition extends HTTP::Servers::StandardServerDefinition, CallExpr {
1413
ServerDefinition() {
1514
// `server = restify.createServer()`
1615
this = DataFlow::moduleMember("restify", "createServer").getACall().asExpr()

0 commit comments

Comments
 (0)