Skip to content

Commit e7e0cf5

Browse files
committed
ruby: add Rack::ResponseNode class
1 parent c28af76 commit e7e0cf5

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,13 +1279,18 @@ class HashLiteralNode extends LocalSourceNode, ExprNode {
12791279
* into calls to `Array.[]`, so this includes both desugared calls as well as
12801280
* explicit calls.
12811281
*/
1282-
class ArrayLiteralNode extends LocalSourceNode, ExprNode {
1283-
ArrayLiteralNode() { super.getExprNode() instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode }
1282+
class ArrayLiteralNode extends LocalSourceNode, CallNode {
1283+
private CfgNodes::ExprNodes::ArrayLiteralCfgNode arrayNode;
1284+
1285+
ArrayLiteralNode() { super.getExprNode() = arrayNode }
12841286

12851287
/**
12861288
* Gets an element of the array.
12871289
*/
1288-
Node getAnElement() { result = this.(CallNode).getPositionalArgument(_) }
1290+
Node getAnElement() { result = this.getElement(_) }
1291+
1292+
/** Gets the `i`th element of the array. */
1293+
Node getElement(int i) { result = this.getPositionalArgument(i) }
12891294
}
12901295

12911296
/**

ruby/ql/lib/codeql/ruby/frameworks/Rack.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ module Rack {
3030
DataFlow::ParameterNode getEnv() { result = call.getParameter(0) }
3131
}
3232

33-
private predicate isRackResponse(DataFlow::Node r) {
33+
class ResponseNode extends DataFlow::ArrayLiteralNode {
3434
// [status, headers, body]
35-
r.asExpr().(ArrayLiteralCfgNode).getNumberOfArguments() = 3
35+
ResponseNode() { this.getNumberOfArguments() = 3 }
3636
}
3737

3838
private DataFlow::LocalSourceNode trackRackResponse(TypeTracker t) {
3939
t.start() and
40-
isRackResponse(result)
40+
result instanceof ResponseNode
4141
or
4242
exists(TypeTracker t2 | result = trackRackResponse(t2).track(t2, t))
4343
}

0 commit comments

Comments
 (0)