Skip to content

Commit 404e27b

Browse files
committed
JS: Port Promises test
Result changes are benign
1 parent 95633a1 commit 404e27b

File tree

4 files changed

+45
-20
lines changed

4 files changed

+45
-20
lines changed

javascript/ql/test/library-tests/Promises/flow.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
await new Promise((resolve, reject) => reject(source));
6666
}
6767
try {
68-
throws();
68+
await throws();
6969
} catch(e) {
7070
sink(e); // NOT OK!
7171
}
Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,60 @@
11
import javascript
22
private import semmle.javascript.dataflow.internal.StepSummary
3+
import testUtilities.LegacyDataFlowDiff
34

4-
class Configuration extends DataFlow::Configuration {
5-
Configuration() { this = "PromiseDataFlowFlowTestingConfig" }
6-
7-
override predicate isSource(DataFlow::Node source) {
5+
module ValueFlowConfig implements DataFlow::ConfigSig {
6+
predicate isSource(DataFlow::Node source) {
87
source.getEnclosingExpr().getStringValue() = "source"
98
}
109

11-
override predicate isSink(DataFlow::Node sink) {
10+
predicate isSink(DataFlow::Node sink) {
1211
any(DataFlow::InvokeNode call | call.getCalleeName() = "sink").getAnArgument() = sink
1312
}
1413
}
1514

16-
class TaintConfig extends TaintTracking::Configuration {
17-
TaintConfig() { this = "PromiseTaintFlowTestingConfig" }
15+
module ValueFlow = DataFlow::Global<ValueFlowConfig>;
1816

19-
override predicate isSource(DataFlow::Node source) {
17+
module TaintConfig implements DataFlow::ConfigSig {
18+
predicate isSource(DataFlow::Node source) {
2019
source.getEnclosingExpr().getStringValue() = "source"
2120
}
2221

23-
override predicate isSink(DataFlow::Node sink) {
22+
predicate isSink(DataFlow::Node sink) {
2423
any(DataFlow::InvokeNode call | call.getCalleeName() = "sink").getAnArgument() = sink
2524
}
2625
}
2726

28-
query predicate flow(DataFlow::Node source, DataFlow::Node sink) {
29-
any(Configuration c).hasFlow(source, sink)
30-
}
27+
module TaintFlow = TaintTracking::Global<TaintConfig>;
28+
29+
query predicate flow(DataFlow::Node source, DataFlow::Node sink) { ValueFlow::flow(source, sink) }
3130

3231
query predicate exclusiveTaintFlow(DataFlow::Node source, DataFlow::Node sink) {
33-
not any(Configuration c).hasFlow(source, sink) and
34-
any(TaintConfig c).hasFlow(source, sink)
32+
not ValueFlow::flow(source, sink) and
33+
TaintFlow::flow(source, sink)
3534
}
3635

3736
query predicate typetrack(DataFlow::SourceNode succ, DataFlow::SourceNode pred, StepSummary summary) {
3837
succ = PromiseTypeTracking::promiseStep(pred, summary)
3938
}
39+
40+
class LegacyValueConfig extends DataFlow::Configuration {
41+
LegacyValueConfig() { this = "LegacyValueConfig" }
42+
43+
override predicate isSource(DataFlow::Node source) { ValueFlowConfig::isSource(source) }
44+
45+
override predicate isSink(DataFlow::Node sink) { ValueFlowConfig::isSink(sink) }
46+
}
47+
48+
query predicate valueFlowDifference =
49+
DataFlowDiff<ValueFlow, LegacyValueConfig>::legacyDataFlowDifference/3;
50+
51+
class LegacyTaintConfig extends TaintTracking::Configuration {
52+
LegacyTaintConfig() { this = "LegacyTaintConfig" }
53+
54+
override predicate isSource(DataFlow::Node source) { TaintConfig::isSource(source) }
55+
56+
override predicate isSink(DataFlow::Node sink) { TaintConfig::isSink(sink) }
57+
}
58+
59+
query predicate taintFlowDifference =
60+
DataFlowDiff<TaintFlow, LegacyTaintConfig>::legacyDataFlowDifference/3;

javascript/ql/test/library-tests/Promises/flow2.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717

1818
var [clean3, tainted3] = await Promise.all(["clean", Promise.resolve(source)]);
1919
sink(clean3); // OK
20-
sink(tainted3); // NOT OK - but only flagged by taint-tracking
20+
sink(tainted3); // NOT OK
2121

2222
var tainted4 = await Promise.race(["clean", Promise.resolve(source)]);
23-
sink(tainted4); // NOT OK - but only flagged by taint-tracking
23+
sink(tainted4); // NOT OK
2424

2525
var tainted5 = await Promise.any(["clean", Promise.resolve(source)]);
26-
sink(tainted5); // NOT OK - but only flagged by taint-tracking
27-
});
26+
sink(tainted5); // NOT OK
27+
});

javascript/ql/test/library-tests/Promises/tests.expected

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ flow
237237
| flow2.js:2:15:2:22 | "source" | flow2.js:6:8:6:13 | arr[0] |
238238
| flow2.js:2:15:2:22 | "source" | flow2.js:12:7:12:13 | tainted |
239239
| flow2.js:2:15:2:22 | "source" | flow2.js:16:7:16:14 | tainted2 |
240+
| flow2.js:2:15:2:22 | "source" | flow2.js:20:7:20:14 | tainted3 |
240241
| flow2.js:2:15:2:22 | "source" | flow2.js:23:7:23:14 | tainted4 |
241242
| flow2.js:2:15:2:22 | "source" | flow2.js:26:7:26:14 | tainted5 |
242243
| flow.js:2:15:2:22 | "source" | flow.js:5:7:5:14 | await p1 |
@@ -273,7 +274,6 @@ flow
273274
| flow.js:136:15:136:22 | "source" | flow.js:142:7:142:19 | await async() |
274275
| flow.js:136:15:136:22 | "source" | flow.js:155:9:155:9 | e |
275276
exclusiveTaintFlow
276-
| flow2.js:2:15:2:22 | "source" | flow2.js:20:7:20:14 | tainted3 |
277277
| flow.js:136:15:136:22 | "source" | flow.js:141:7:141:13 | async() |
278278
| flow.js:160:15:160:22 | "source" | flow.js:164:39:164:39 | x |
279279
| flow.js:160:15:160:22 | "source" | flow.js:167:7:167:9 | foo |
@@ -367,6 +367,7 @@ typetrack
367367
| flow.js:62:2:62:24 | p12.cat ... ink(x)) | flow.js:62:17:62:23 | sink(x) | copy $PromiseResolveField$ |
368368
| flow.js:62:2:62:24 | p12.cat ... ink(x)) | flow.js:62:17:62:23 | sink(x) | store $PromiseResolveField$ |
369369
| flow.js:65:3:65:56 | await n ... ource)) | flow.js:65:9:65:56 | new Pro ... ource)) | load $PromiseResolveField$ |
370+
| flow.js:68:3:68:16 | await throws() | flow.js:68:9:68:16 | throws() | load $PromiseResolveField$ |
370371
| flow.js:76:2:76:52 | chained ... ink(e)) | flow.js:76:2:76:32 | chained ... => {}) | copy $PromiseResolveField$ |
371372
| flow.js:76:2:76:52 | chained ... ink(e)) | flow.js:76:45:76:51 | sink(e) | copy $PromiseResolveField$ |
372373
| flow.js:76:2:76:52 | chained ... ink(e)) | flow.js:76:45:76:51 | sink(e) | store $PromiseResolveField$ |
@@ -462,3 +463,6 @@ typetrack
462463
| promises.js:143:17:143:50 | Synchro ... source) | promises.js:143:44:143:49 | source | store $PromiseResolveField$ |
463464
| promises.js:153:17:153:39 | Promise ... source) | promises.js:153:33:153:38 | source | copy $PromiseResolveField$ |
464465
| promises.js:153:17:153:39 | Promise ... source) | promises.js:153:33:153:38 | source | store $PromiseResolveField$ |
466+
valueFlowDifference
467+
| flow2.js:2:15:2:22 | "source" | flow2.js:20:7:20:14 | tainted3 | only flow with NEW data flow library |
468+
taintFlowDifference

0 commit comments

Comments
 (0)