Skip to content

Commit 02fc45d

Browse files
authored
Merge pull request #1232 from xiemaisi/js/more-socket-improvements
Approved by asger-semmle
2 parents 5101a5b + 20312fc commit 02fc45d

File tree

5 files changed

+27
-10
lines changed

5 files changed

+27
-10
lines changed

javascript/ql/src/semmle/javascript/frameworks/SocketIO.qll

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,8 @@ module SocketIOClient {
399399
exists(DataFlow::SourceNode io |
400400
io = DataFlow::globalVarRef("io") or
401401
io = DataFlow::globalVarRef("io").getAPropertyRead("connect") or
402+
io = DataFlow::moduleImport("io") or
403+
io = DataFlow::moduleMember("io", "connect") or
402404
io = DataFlow::moduleImport("socket.io-client") or
403405
io = DataFlow::moduleMember("socket.io-client", "connect")
404406
|
@@ -479,9 +481,18 @@ module SocketIOClient {
479481
/** Gets the event name associated with the data, if it can be determined. */
480482
string getEventName() { getArgument(0).mayHaveStringValue(result) }
481483

484+
private DataFlow::SourceNode getListener(DataFlow::TypeBackTracker t) {
485+
t.start() and
486+
result = getArgument(1).getALocalSource()
487+
or
488+
exists(DataFlow::TypeBackTracker t2 |
489+
result = getListener(t2).backtrack(t2, t)
490+
)
491+
}
492+
482493
/** Gets the callback that handles data received from the server. */
483494
private DataFlow::FunctionNode getListener() {
484-
result = getCallback(1)
495+
result = getListener(DataFlow::TypeBackTracker::end())
485496
}
486497

487498
/** Gets the `i`th parameter through which data is received from the server. */

javascript/ql/test/library-tests/frameworks/SocketIO/client2.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,4 @@ sock.emit('data', "hi", "there");
1515

1616
sock.write("do you copy?", () => {});
1717

18-
sock2.on('message', (x) => {
19-
console.log(x);
20-
});
18+
sock2.on('message', require('./handler'));
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import io from "io";
2+
3+
io();
4+
io.connect("/messages");
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = (x) => console.log(x);

javascript/ql/test/library-tests/frameworks/SocketIO/tests.expected

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
test_ClientReceiveNode_getEventName
22
| client2.js:4:1:6:2 | sock.on ... y);\\n}) | message |
33
| client2.js:10:1:12:2 | sock.on ... d");\\n}) | event |
4-
| client2.js:18:1:20:2 | sock2.o ... (x);\\n}) | message |
4+
| client2.js:18:1:18:41 | sock2.o ... dler')) | message |
55
test_NamespaceNode
66
| tst.js:25:10:25:19 | io.sockets | socket.io namespace with path '/' |
77
| tst.js:26:11:26:27 | io.of("/foo/bar") | socket.io namespace with path '/foo/bar' |
@@ -47,7 +47,7 @@ test_ClientReceiveNode_getASender
4747
| client2.js:8:1:8:33 | sock.on ... => {}) | tst.js:55:3:55:27 | socket. ... ssage') |
4848
| client2.js:10:1:12:2 | sock.on ... d");\\n}) | tst.js:30:1:30:28 | ns.emit ... event') |
4949
| client2.js:10:1:12:2 | sock.on ... d");\\n}) | tst.js:51:3:51:22 | socket.emit('event') |
50-
| client2.js:18:1:20:2 | sock2.o ... (x);\\n}) | tst.js:32:1:32:22 | ns2.wri ... ssage') |
50+
| client2.js:18:1:18:41 | sock2.o ... dler')) | tst.js:32:1:32:22 | ns2.wri ... ssage') |
5151
test_ReceiveNode
5252
| tst.js:70:3:70:35 | socket. ... => {}) | tst.js:69:22:69:27 | socket |
5353
| tst.js:71:3:71:46 | socket. ... => {}) | tst.js:69:22:69:27 | socket |
@@ -66,11 +66,12 @@ test_AdditionalFlowStep
6666
| client2.js:16:12:16:25 | "do you copy?" | tst.js:70:25:70:27 | msg |
6767
| client2.js:16:12:16:25 | "do you copy?" | tst.js:71:27:71:31 | data1 |
6868
| client3.js:1:8:1:9 | io | client3.js:1:8:1:9 | io |
69+
| client4.js:1:8:1:9 | io | client4.js:1:8:1:9 | io |
6970
| tst.js:30:18:30:27 | 'an event' | client2.js:8:23:8:25 | msg |
7071
| tst.js:30:18:30:27 | 'an event' | client2.js:10:19:10:19 | x |
7172
| tst.js:31:9:31:19 | 'a message' | client2.js:4:21:4:21 | x |
7273
| tst.js:31:9:31:19 | 'a message' | client2.js:8:23:8:25 | msg |
73-
| tst.js:32:11:32:21 | 'a message' | client2.js:18:22:18:22 | x |
74+
| tst.js:32:11:32:21 | 'a message' | handler.js:1:19:1:19 | x |
7475
| tst.js:39:20:39:30 | 'a message' | client2.js:4:21:4:21 | x |
7576
| tst.js:39:20:39:30 | 'a message' | client2.js:8:23:8:25 | msg |
7677
| tst.js:40:9:40:19 | 'a message' | client2.js:4:21:4:21 | x |
@@ -123,6 +124,8 @@ test_ClientSocketNode
123124
| client2.js:1:12:1:56 | require ... lhost") | / |
124125
| client2.js:2:13:2:85 | require ... v#abc") | /foo/bar |
125126
| client3.js:3:1:3:4 | io() | / |
127+
| client4.js:3:1:3:4 | io() | / |
128+
| client4.js:4:1:4:23 | io.conn ... sages") | /messages |
126129
test_ReceiveNode_getASender
127130
| tst.js:70:3:70:35 | socket. ... => {}) | client2.js:16:1:16:36 | sock.wr ... => {}) |
128131
| tst.js:71:3:71:46 | socket. ... => {}) | client2.js:16:1:16:36 | sock.wr ... => {}) |
@@ -162,7 +165,7 @@ test_ClientReceiveNode_getReceivedItem
162165
| client2.js:4:1:6:2 | sock.on ... y);\\n}) | 1 | client2.js:4:24:4:24 | y |
163166
| client2.js:8:1:8:33 | sock.on ... => {}) | 0 | client2.js:8:23:8:25 | msg |
164167
| client2.js:10:1:12:2 | sock.on ... d");\\n}) | 0 | client2.js:10:19:10:19 | x |
165-
| client2.js:18:1:20:2 | sock2.o ... (x);\\n}) | 0 | client2.js:18:22:18:22 | x |
168+
| client2.js:18:1:18:41 | sock2.o ... dler')) | 0 | handler.js:1:19:1:19 | x |
166169
test_NamespaceObject
167170
| socket.io namespace with path '/' | tst.js:1:12:1:33 | socket.io server | / |
168171
| socket.io namespace with path '/' | tst.js:4:13:4:24 | socket.io server | / |
@@ -172,7 +175,7 @@ test_ClientReceiveNode
172175
| client2.js:4:1:6:2 | sock.on ... y);\\n}) | client2.js:1:12:1:56 | require ... lhost") |
173176
| client2.js:8:1:8:33 | sock.on ... => {}) | client2.js:1:12:1:56 | require ... lhost") |
174177
| client2.js:10:1:12:2 | sock.on ... d");\\n}) | client2.js:1:12:1:56 | require ... lhost") |
175-
| client2.js:18:1:20:2 | sock2.o ... (x);\\n}) | client2.js:2:13:2:85 | require ... v#abc") |
178+
| client2.js:18:1:18:41 | sock2.o ... dler')) | client2.js:2:13:2:85 | require ... v#abc") |
176179
test_ClientSendNode
177180
| client2.js:14:1:14:32 | sock.em ... there") | client2.js:1:12:1:56 | require ... lhost") | / |
178181
| client2.js:16:1:16:36 | sock.wr ... => {}) | client2.js:1:12:1:56 | require ... lhost") | / |
@@ -193,7 +196,7 @@ test_SendNode_getAReceiver
193196
| tst.js:30:1:30:28 | ns.emit ... event') | client2.js:10:1:12:2 | sock.on ... d");\\n}) |
194197
| tst.js:31:1:31:20 | ns.send('a message') | client2.js:4:1:6:2 | sock.on ... y);\\n}) |
195198
| tst.js:31:1:31:20 | ns.send('a message') | client2.js:8:1:8:33 | sock.on ... => {}) |
196-
| tst.js:32:1:32:22 | ns2.wri ... ssage') | client2.js:18:1:20:2 | sock2.o ... (x);\\n}) |
199+
| tst.js:32:1:32:22 | ns2.wri ... ssage') | client2.js:18:1:18:41 | sock2.o ... dler')) |
197200
| tst.js:39:1:39:31 | io.emit ... ssage') | client2.js:4:1:6:2 | sock.on ... y);\\n}) |
198201
| tst.js:39:1:39:31 | io.emit ... ssage') | client2.js:8:1:8:33 | sock.on ... => {}) |
199202
| tst.js:40:1:40:20 | io.send('a message') | client2.js:4:1:6:2 | sock.on ... y);\\n}) |

0 commit comments

Comments
 (0)