Skip to content

Commit 967ccfe

Browse files
committed
add support for kew
1 parent 05389bb commit 967ccfe

5 files changed

Lines changed: 26 additions & 3 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
lgtm,codescanning
2+
* The security queries now track flow through various `Promise` polyfills.
3+
Affected packages are
4+
[kew](https://npmjs.com/package/kew)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -562,14 +562,14 @@ module Bluebird {
562562
}
563563

564564
/**
565-
* Provides classes for working with the `q` library (https://github.com/kriskowal/q).
565+
* Provides classes for working with the `q` library (https://github.com/kriskowal/q) and the compatible `kew` library (https://github.com/Medium/kew).
566566
*/
567567
module Q {
568568
/**
569569
* A promise object created by the q `Promise` constructor.
570570
*/
571571
private class QPromiseDefinition extends PromiseDefinition, DataFlow::CallNode {
572-
QPromiseDefinition() { this = DataFlow::moduleMember("q", "Promise").getACall() }
572+
QPromiseDefinition() { this = DataFlow::moduleMember(["q", "kew"], "Promise").getACall() }
573573

574574
override DataFlow::FunctionNode getExecutor() { result = getCallback(0) }
575575
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,4 @@
7979
| promises.js:71:5:71:27 | Promise ... source) |
8080
| promises.js:72:5:72:41 | new Pro ... ource)) |
8181
| promises.js:79:19:79:41 | Promise ... source) |
82+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) |

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,15 @@
8080
promise.then(function (val) {
8181
var sink = val;
8282
});
83-
})();
83+
})();
84+
85+
86+
(function() {
87+
var Q = require("kew");
88+
var promise = Q.Promise(function (resolve, reject) {
89+
resolve(source);
90+
});
91+
promise.then(function (val) {
92+
var sink = val;
93+
});
94+
})();

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ test_PromiseDefinition_getExecutor
8282
| promises.js:10:18:17:4 | new Pro ... );\\n }) | promises.js:10:30:17:3 | (res, r ... e);\\n } |
8383
| promises.js:33:19:35:6 | new Pro ... \\n }) | promises.js:33:31:35:5 | functio ... ;\\n } |
8484
| promises.js:43:19:45:6 | Q.Promi ... \\n }) | promises.js:43:29:45:5 | functio ... ;\\n } |
85+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) | promises.js:88:27:90:3 | functio ... e);\\n } |
8586
test_PromiseDefinition_getAFinallyHandler
8687
| flow.js:105:2:105:48 | new Pro ... "BLA")) | flow.js:105:58:105:76 | x => {throw source} |
8788
| flow.js:109:2:109:48 | new Pro ... "BLA")) | flow.js:109:58:109:70 | x => rejected |
@@ -117,6 +118,7 @@ test_PromiseDefinition
117118
| promises.js:10:18:17:4 | new Pro ... );\\n }) |
118119
| promises.js:33:19:35:6 | new Pro ... \\n }) |
119120
| promises.js:43:19:45:6 | Q.Promi ... \\n }) |
121+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) |
120122
test_PromiseDefinition_getAResolveHandler
121123
| flow.js:24:2:24:49 | new Pro ... ource)) | flow.js:24:56:24:67 | x => sink(x) |
122124
| flow.js:26:2:26:49 | new Pro ... ource)) | flow.js:26:56:26:66 | x => foo(x) |
@@ -134,6 +136,7 @@ test_PromiseDefinition_getAResolveHandler
134136
| promises.js:10:18:17:4 | new Pro ... );\\n }) | promises.js:26:20:28:3 | (v) => ... v;\\n } |
135137
| promises.js:33:19:35:6 | new Pro ... \\n }) | promises.js:36:18:38:5 | functio ... ;\\n } |
136138
| promises.js:43:19:45:6 | Q.Promi ... \\n }) | promises.js:46:18:48:5 | functio ... ;\\n } |
139+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) | promises.js:91:16:93:3 | functio ... al;\\n } |
137140
test_PromiseDefinition_getRejectParameter
138141
| flow.js:7:11:7:59 | new Pro ... ource)) | flow.js:7:33:7:38 | reject |
139142
| flow.js:10:11:10:58 | new Pro ... ource)) | flow.js:10:33:10:38 | reject |
@@ -164,6 +167,7 @@ test_PromiseDefinition_getRejectParameter
164167
| promises.js:10:18:17:4 | new Pro ... );\\n }) | promises.js:10:36:10:38 | rej |
165168
| promises.js:33:19:35:6 | new Pro ... \\n }) | promises.js:33:50:33:55 | reject |
166169
| promises.js:43:19:45:6 | Q.Promi ... \\n }) | promises.js:43:48:43:53 | reject |
170+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) | promises.js:88:46:88:51 | reject |
167171
test_PromiseDefinition_getResolveParameter
168172
| flow.js:7:11:7:59 | new Pro ... ource)) | flow.js:7:24:7:30 | resolve |
169173
| flow.js:10:11:10:58 | new Pro ... ource)) | flow.js:10:24:10:30 | resolve |
@@ -194,6 +198,7 @@ test_PromiseDefinition_getResolveParameter
194198
| promises.js:10:18:17:4 | new Pro ... );\\n }) | promises.js:10:31:10:33 | res |
195199
| promises.js:33:19:35:6 | new Pro ... \\n }) | promises.js:33:41:33:47 | resolve |
196200
| promises.js:43:19:45:6 | Q.Promi ... \\n }) | promises.js:43:39:43:45 | resolve |
201+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) | promises.js:88:37:88:43 | resolve |
197202
test_PromiseDefinition_getACatchHandler
198203
| flow.js:32:2:32:49 | new Pro ... ource)) | flow.js:32:57:32:68 | x => sink(x) |
199204
| flow.js:48:2:48:36 | new Pro ... urce }) | flow.js:48:44:48:55 | x => sink(x) |
@@ -400,3 +405,5 @@ typetrack
400405
| promises.js:71:34:71:36 | val | promises.js:71:5:71:27 | Promise ... source) | load $PromiseResolveField$ |
401406
| promises.js:72:48:72:50 | val | promises.js:72:5:72:41 | new Pro ... ource)) | load $PromiseResolveField$ |
402407
| promises.js:75:27:75:29 | val | promises.js:75:5:75:20 | resolver.promise | load $PromiseResolveField$ |
408+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) | promises.js:89:15:89:20 | source | copy $PromiseResolveField$ |
409+
| promises.js:88:17:90:4 | Q.Promi ... );\\n }) | promises.js:89:15:89:20 | source | store $PromiseResolveField$ |

0 commit comments

Comments
 (0)