Skip to content

Commit 4bc91c4

Browse files
committed
add support for Promise.any
1 parent 9f1b3d6 commit 4bc91c4

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

javascript/ql/src/semmle/javascript/Promises.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,11 @@ class ResolvedES2015PromiseDefinition extends ResolvedPromiseDefinition {
117117
}
118118

119119
/**
120-
* An aggregated promise produced either by `Promise.all` or `Promise.race`.
120+
* An aggregated promise produced either by `Promise.all`, `Promise.race`, or `Promise.any`.
121121
*/
122122
class AggregateES2015PromiseDefinition extends PromiseCreationCall {
123123
AggregateES2015PromiseDefinition() {
124-
exists(string m | m = "all" or m = "race" |
124+
exists(string m | m = "all" or m = "race" or m = "any" |
125125
this = DataFlow::globalVarRef("Promise").getAMemberCall(m)
126126
)
127127
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,10 @@
1818
var [clean3, tainted3] = await Promise.all(["clean", Promise.resolve(source)]);
1919
sink(clean3); // OK
2020
sink(tainted3); // NOT OK - but only flagged by taint-tracking
21+
22+
var tainted4 = await Promise.race(["clean", Promise.resolve(source)]);
23+
sink(tainted4); // NOT OK - but only flagged by taint-tracking
24+
25+
var tainted5 = await Promise.any(["clean", Promise.resolve(source)]);
26+
sink(tainted5); // NOT OK - but only flagged by taint-tracking
2127
});

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ test_ResolvedPromiseDefinition
99
| flow2.js:18:33:18:79 | Promise ... urce)]) | flow2.js:18:46:18:52 | "clean" |
1010
| flow2.js:18:33:18:79 | Promise ... urce)]) | flow2.js:18:55:18:77 | Promise ... source) |
1111
| flow2.js:18:55:18:77 | Promise ... source) | flow2.js:18:71:18:76 | source |
12+
| flow2.js:22:23:22:70 | Promise ... urce)]) | flow2.js:22:37:22:43 | "clean" |
13+
| flow2.js:22:23:22:70 | Promise ... urce)]) | flow2.js:22:46:22:68 | Promise ... source) |
14+
| flow2.js:22:46:22:68 | Promise ... source) | flow2.js:22:62:22:67 | source |
15+
| flow2.js:25:23:25:69 | Promise ... urce)]) | flow2.js:25:36:25:42 | "clean" |
16+
| flow2.js:25:23:25:69 | Promise ... urce)]) | flow2.js:25:45:25:67 | Promise ... source) |
17+
| flow2.js:25:45:25:67 | Promise ... source) | flow2.js:25:61:25:66 | source |
1218
| flow.js:4:11:4:33 | Promise ... source) | flow.js:4:27:4:32 | source |
1319
| flow.js:20:2:20:24 | Promise ... source) | flow.js:20:18:20:23 | source |
1420
| flow.js:22:2:22:24 | Promise ... source) | flow.js:22:18:22:23 | source |
@@ -201,6 +207,8 @@ flow
201207
| flow2.js:2:15:2:22 | "source" | flow2.js:6:8:6:13 | arr[0] |
202208
| flow2.js:2:15:2:22 | "source" | flow2.js:12:7:12:13 | tainted |
203209
| flow2.js:2:15:2:22 | "source" | flow2.js:16:7:16:14 | tainted2 |
210+
| flow2.js:2:15:2:22 | "source" | flow2.js:23:7:23:14 | tainted4 |
211+
| flow2.js:2:15:2:22 | "source" | flow2.js:26:7:26:14 | tainted5 |
204212
| flow.js:2:15:2:22 | "source" | flow.js:5:7:5:14 | await p1 |
205213
| flow.js:2:15:2:22 | "source" | flow.js:8:7:8:14 | await p2 |
206214
| flow.js:2:15:2:22 | "source" | flow.js:17:8:17:8 | e |
@@ -255,6 +263,12 @@ typetrack
255263
| flow2.js:18:27:18:79 | await P ... urce)]) | flow2.js:18:33:18:79 | Promise ... urce)]) | load $PromiseResolveField$ |
256264
| flow2.js:18:33:18:79 | Promise ... urce)]) | flow2.js:18:45:18:78 | ["clean ... ource)] | copy $PromiseResolveField$ |
257265
| flow2.js:18:33:18:79 | Promise ... urce)]) | flow2.js:18:45:18:78 | ["clean ... ource)] | store $PromiseResolveField$ |
266+
| flow2.js:22:17:22:70 | await P ... urce)]) | flow2.js:22:23:22:70 | Promise ... urce)]) | load $PromiseResolveField$ |
267+
| flow2.js:22:23:22:70 | Promise ... urce)]) | flow2.js:22:46:22:68 | Promise ... source) | copy $PromiseResolveField$ |
268+
| flow2.js:22:23:22:70 | Promise ... urce)]) | flow2.js:22:46:22:68 | Promise ... source) | store $PromiseResolveField$ |
269+
| flow2.js:25:17:25:69 | await P ... urce)]) | flow2.js:25:23:25:69 | Promise ... urce)]) | load $PromiseResolveField$ |
270+
| flow2.js:25:23:25:69 | Promise ... urce)]) | flow2.js:25:45:25:67 | Promise ... source) | copy $PromiseResolveField$ |
271+
| flow2.js:25:23:25:69 | Promise ... urce)]) | flow2.js:25:45:25:67 | Promise ... source) | store $PromiseResolveField$ |
258272
| flow.js:20:2:20:43 | Promise ... ink(x)) | flow.js:20:36:20:42 | sink(x) | copy $PromiseResolveField$ |
259273
| flow.js:20:2:20:43 | Promise ... ink(x)) | flow.js:20:36:20:42 | sink(x) | store $PromiseResolveField$ |
260274
| flow.js:20:31:20:31 | x | flow.js:20:2:20:24 | Promise ... source) | load $PromiseResolveField$ |

0 commit comments

Comments
 (0)