Skip to content

Commit 6bef5a7

Browse files
committed
JS: Add dedicated API graph label for receiver, instead of parameter -1
1 parent bbf60b8 commit 6bef5a7

File tree

4 files changed

+16
-10
lines changed

4 files changed

+16
-10
lines changed

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,10 @@ module API {
561561
rhs = f.getExceptionalReturn()
562562
)
563563
or
564-
exists(int i |
565-
lbl = Label::parameter(i) and
566-
argumentPassing(base, i, rhs)
564+
exists(int i | argumentPassing(base, i, rhs) |
565+
lbl = Label::parameter(i)
566+
or
567+
i = -1 and lbl = Label::receiver()
567568
)
568569
or
569570
exists(DataFlow::SourceNode src, DataFlow::PropWrite pw |
@@ -1096,8 +1097,8 @@ module API {
10961097
*/
10971098
LabelParameter parameter(int i) { result.getIndex() = i }
10981099

1099-
/** Gets the `parameter` edge label for the receiver. */
1100-
LabelParameter receiver() { result = parameter(-1) }
1100+
/** Gets the edge label for the receiver. */
1101+
LabelReceiver receiver() { any() }
11011102

11021103
/** Gets the `return` edge label. */
11031104
LabelReturn return() { any() }
@@ -1132,12 +1133,13 @@ module API {
11321133
MkLabelUnknownMember() or
11331134
MkLabelParameter(int i) {
11341135
i =
1135-
[-1 .. max(int args |
1136+
[0 .. max(int args |
11361137
args = any(InvokeExpr invk).getNumArgument() or
11371138
args = any(Function f).getNumParameter()
11381139
)] or
11391140
i = [0 .. 10]
11401141
} or
1142+
MkLabelReceiver() or
11411143
MkLabelReturn() or
11421144
MkLabelPromised() or
11431145
MkLabelPromisedError() or
@@ -1225,6 +1227,11 @@ module API {
12251227
/** Gets the index of the parameter for this label. */
12261228
int getIndex() { result = i }
12271229
}
1230+
1231+
/** A label for the receiver of call, that is, the value passed as `this`. */
1232+
class LabelReceiver extends ApiLabel, MkLabelReceiver {
1233+
override string toString() { result = "receiver" }
1234+
}
12281235
}
12291236
}
12301237
}

javascript/ql/lib/semmle/javascript/security/dataflow/ExternalAPIUsedWithUntrustedDataCustomizations.qll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ module ExternalApiUsedWithUntrustedData {
219219
or
220220
exists(string callbackName, int index |
221221
node = getNamedParameter(base.getParameter(index).getMember(callbackName), paramName) and
222-
index != -1 and // ignore receiver
223222
result =
224223
basename + ".[callback " + index + " '" + callbackName + "'].[param '" + paramName +
225224
"']"

javascript/ql/test/ApiGraphs/bound-args/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import bar from 'foo';
22

33
let boundbar = bar.bind(
4-
"receiver", // def (parameter -1 (member default (member exports (module foo))))
4+
"receiver", // def (receiver (member default (member exports (module foo))))
55
"firstarg" // def (parameter 0 (member default (member exports (module foo))))
66
);
77
boundbar(
88
"secondarg" // def (parameter 1 (member default (member exports (module foo))))
99
)
1010

1111
let boundbar2 = boundbar.bind(
12-
"ignored", // !def (parameter -1 (member default (member exports (module foo))))
12+
"ignored", // !def (receiver (member default (member exports (module foo))))
1313
"othersecondarg" // def (parameter 1 (member default (member exports (module foo))))
1414
)
1515
boundbar2(

javascript/ql/test/ApiGraphs/partial-invoke/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const cp = require('child_process');
22

33
module.exports = function () {
44
return cp.spawn.bind(
5-
cp, // def (parameter -1 (member spawn (member exports (module child_process))))
5+
cp, // def (receiver (member spawn (member exports (module child_process))))
66
"cat" // def (parameter 0 (member spawn (member exports (module child_process))))
77
);
88
};

0 commit comments

Comments
 (0)