Skip to content

Commit ea8c8df

Browse files
committed
JS: Fix bad join orders in summarizedHigherOrderCall
1 parent 01fd00d commit ea8c8df

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

javascript/ql/src/semmle/javascript/dataflow/Configuration.qll

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,19 +1356,20 @@ private predicate summarizedHigherOrderCall(
13561356
DataFlow::Node arg, DataFlow::Node cb, int i, DataFlow::Configuration cfg, PathSummary summary
13571357
) {
13581358
exists(
1359-
Function f, DataFlow::InvokeNode outer, DataFlow::InvokeNode inner, int j,
1360-
DataFlow::Node innerArg, DataFlow::SourceNode cbParm, PathSummary oldSummary
1359+
Function f, DataFlow::InvokeNode inner, int j, DataFlow::Node innerArg,
1360+
DataFlow::SourceNode cbParm, PathSummary oldSummary
13611361
|
13621362
// Captured flow does not need to be summarized - it is handled by the local case in `higherOrderCall`.
1363-
not arg = DataFlow::capturedVariableNode(_) and
1364-
summarizedHigherOrderCallAux(f, outer, arg, innerArg, cfg, oldSummary, cbParm, inner, j, cb)
1363+
not arg = DataFlow::capturedVariableNode(_)
13651364
|
13661365
// direct higher-order call
1366+
summarizedHigherOrderCallAux(f, arg, innerArg, cfg, oldSummary, cbParm, inner, j, cb) and
13671367
cbParm.flowsTo(inner.getCalleeNode()) and
13681368
i = j and
13691369
summary = oldSummary
13701370
or
13711371
// indirect higher-order call
1372+
summarizedHigherOrderCallAux(f, arg, innerArg, cfg, oldSummary, cbParm, inner, j, cb) and
13721373
exists(DataFlow::Node cbArg, PathSummary newSummary |
13731374
cbParm.flowsTo(cbArg) and
13741375
summarizedHigherOrderCall(innerArg, cbArg, i, cfg, newSummary) and
@@ -1382,14 +1383,17 @@ private predicate summarizedHigherOrderCall(
13821383
*/
13831384
pragma[noinline]
13841385
private predicate summarizedHigherOrderCallAux(
1385-
Function f, DataFlow::InvokeNode outer, DataFlow::Node arg, DataFlow::Node innerArg,
1386-
DataFlow::Configuration cfg, PathSummary oldSummary, DataFlow::SourceNode cbParm,
1387-
DataFlow::InvokeNode inner, int j, DataFlow::Node cb
1386+
Function f, DataFlow::Node arg, DataFlow::Node innerArg, DataFlow::Configuration cfg,
1387+
PathSummary oldSummary, DataFlow::SourceNode cbParm, DataFlow::InvokeNode inner, int j,
1388+
DataFlow::Node cb
13881389
) {
1389-
reachableFromInput(f, outer, arg, innerArg, cfg, oldSummary) and
1390-
// Only track actual parameter flow.
1391-
argumentPassing(outer, cb, f, cbParm) and
1392-
innerArg = inner.getArgument(j)
1390+
exists(DataFlow::Node outer1, DataFlow::Node outer2 |
1391+
reachableFromInput(f, outer1, arg, innerArg, cfg, oldSummary) and
1392+
outer1 = pragma[only_bind_into](outer2) and
1393+
// Only track actual parameter flow.
1394+
argumentPassing(outer2, cb, f, cbParm) and
1395+
innerArg = inner.getArgument(j)
1396+
)
13931397
}
13941398

13951399
/**

0 commit comments

Comments
 (0)