Skip to content

Commit 179aaa1

Browse files
committed
Ruby: model Open4.popen4ext
1 parent d0e7fbc commit 179aaa1

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

ruby/ql/lib/codeql/ruby/frameworks/stdlib/Open3.qll

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,26 @@ module Open3 {
3838
*/
3939
class Open4Call extends SystemCommandExecution::Range instanceof DataFlow::CallNode {
4040
Open4Call() {
41-
this = API::getTopLevelMember("Open4").getAMethodCall(["open4", "popen4", "spawn"])
41+
this =
42+
API::getTopLevelMember("Open4").getAMethodCall(["open4", "popen4", "spawn", "popen4ext"])
4243
}
4344

44-
override DataFlow::Node getAnArgument() { result = super.getArgument(_) }
45+
override DataFlow::Node getAnArgument() {
46+
// `popen4ext` takes an optional boolean as its first argument, but it is unlikely that we will be
47+
// tracking flow into a boolean value so it doesn't seem worth modeling that special case here.
48+
result = super.getArgument(_)
49+
}
4550

4651
override predicate isShellInterpreted(DataFlow::Node arg) {
4752
super.getNumberOfArguments() = 1 and
4853
arg = this.getAnArgument()
54+
or
55+
// ```rb
56+
// Open4.popen4ext(true, "some cmd")
57+
// ```
58+
super.getNumberOfArguments() = 2 and
59+
super.getArgument(0).getConstantValue().isBoolean(_) and
60+
arg = super.getArgument(1)
4961
}
5062
}
5163

ruby/ql/test/library-tests/frameworks/stdlib/Open3.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ open4CallExecutions
1515
| Open3.rb:13:1:13:24 | call to open4 |
1616
| Open3.rb:14:1:14:25 | call to popen4 |
1717
| Open3.rb:15:1:15:23 | call to spawn |
18+
| Open3.rb:16:1:16:27 | call to popen4ext |
19+
| Open3.rb:17:1:17:30 | call to popen4ext |
20+
| Open3.rb:18:1:18:33 | call to popen4ext |
21+
| Open3.rb:19:1:19:36 | call to popen4ext |

ruby/ql/test/library-tests/frameworks/stdlib/Open3.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@
1313
Open4::open4("echo foo")
1414
Open4::popen4("echo foo")
1515
Open4.spawn("echo bar")
16+
Open4.popen4ext("echo foo")
17+
Open4.popen4ext("echo", "foo")
18+
Open4.popen4ext(true, "echo foo")
19+
Open4.popen4ext(true, "echo", "foo")

0 commit comments

Comments
 (0)