Skip to content

Commit e2725dd

Browse files
committed
JS: improve NodeJSEventEmitter model
1 parent b5c449b commit e2725dd

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

Diff for: javascript/ql/src/semmle/javascript/frameworks/NodeJSLib.qll

+7-2
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ module NodeJSLib {
783783
/**
784784
* A model of a URL request in the Node.js `http` library.
785785
*/
786-
private class NodeHttpUrlRequest extends NodeJSClientRequest::Range {
786+
private class NodeHttpUrlRequest extends NodeJSClientRequest::Range, NodeJSEventEmitter {
787787
DataFlow::Node url;
788788

789789
NodeHttpUrlRequest() {
@@ -1021,7 +1021,12 @@ module NodeJSLib {
10211021
}
10221022

10231023
private class ClientRequestEventEmitter extends NodeJSEventEmitter {
1024-
ClientRequestEventEmitter() { this = any(ClientRequestHandler handler).getAParameter() }
1024+
ClientRequestEventEmitter() {
1025+
exists(ClientRequestHandler handler |
1026+
not handler.getAHandledEvent() = "error" and
1027+
this = handler.getAParameter()
1028+
)
1029+
}
10251030
}
10261031

10271032
/**

Diff for: javascript/ql/test/library-tests/frameworks/EventEmitter/test.expected

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ eventEmitter
2222
| customEmitter.js:20:9:20:29 | new MyS ... itter() |
2323
| tst2.js:6:12:6:42 | new Con ... , opts) |
2424
| tst2.js:16:10:16:24 | new Connector() |
25-
| tst2.js:21:17:21:20 | data |
25+
| tst2.js:22:37:22:39 | res |
26+
| tst2.js:25:28:25:33 | socket |
27+
| tst2.js:29:37:29:39 | res |
28+
| tst2.js:32:28:32:33 | socket |
2629
| tst.js:3:10:3:22 | new emitter() |
2730
| tst.js:13:11:13:23 | new emitter() |
2831
| tst.js:18:11:18:23 | new emitter() |

Diff for: javascript/ql/test/library-tests/frameworks/EventEmitter/tst2.js

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
var util = require('util');
2-
var EventEmitter = require('events').EventEmitter;
1+
var util = require("util");
2+
var EventEmitter = require("events").EventEmitter;
33

44
var Connector = function() {
55
if (!(this instanceof Connector)) {
@@ -17,5 +17,18 @@ var em = new Connector();
1717
em.on("foo", bar => {});
1818
em.emit("foo", "bar");
1919

20-
var http = require('http');
21-
http.request(x, data => data.on("data", d => undefined ));
20+
var http = require("http");
21+
22+
let req1 = http.request(x, function(res) {
23+
res.on("data", function(data) {});
24+
});
25+
req1.on("socket", function(socket) {
26+
socket.on("data", function(data) {});
27+
});
28+
29+
let req2 = http.request(x, function(res) {
30+
res.on("error", function(error) {});
31+
});
32+
req2.on("socket", function(socket) {
33+
socket.on("error", function(error) {});
34+
});

0 commit comments

Comments
 (0)