Skip to content

Commit e1784bb

Browse files
committed
JS: Fix handling of spread args on a bound function
1 parent 149ec20 commit e1784bb

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -962,11 +962,14 @@ module API {
962962
}
963963

964964
private predicate spreadArgumentPassing(TApiNode base, int i, DataFlow::Node spreadArray) {
965-
exists(DataFlow::Node use, DataFlow::SourceNode pred, int bound, InvokeExpr invoke |
965+
exists(
966+
DataFlow::Node use, DataFlow::SourceNode pred, int bound, InvokeExpr invoke, int spreadPos
967+
|
966968
use(base, use) and
967969
pred = trackUseNode(use, _, bound, "") and
968-
invoke = getAnInvocationWithSpread(pred, i) and
969-
spreadArray = invoke.getArgument(i - bound).(SpreadElement).getOperand().flow()
970+
invoke = getAnInvocationWithSpread(pred, spreadPos) and
971+
spreadArray = invoke.getArgument(spreadPos).(SpreadElement).getOperand().flow() and
972+
i = bound + spreadPos
970973
)
971974
}
972975

javascript/ql/test/ApiGraphs/spread/tst.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,12 @@ function getArgs() {
1818
}
1919

2020
lib.m2(...getArgs());
21+
22+
function f3() {
23+
return [
24+
'x', /* def=moduleImport("something").getMember("exports").getMember("m3").getSpreadArgument(1).getArrayElement() */
25+
'y', /* def=moduleImport("something").getMember("exports").getMember("m3").getSpreadArgument(1).getArrayElement() */
26+
]
27+
}
28+
29+
lib.m3.bind(undefined, 1)(...f3());

0 commit comments

Comments
 (0)