22 * Provides modeling for the `Open3` library.
33 */
44
5+ private import ruby
56private import codeql.ruby.AST
67private import codeql.ruby.DataFlow
78private import codeql.ruby.ApiGraphs
89private import codeql.ruby.frameworks.Stdlib
910private import codeql.ruby.Concepts
11+ private import codeql.ruby.frameworks.core.Kernel
1012
1113/**
1214 * Provides modeling for the `Open3` library.
@@ -17,23 +19,19 @@ module Open3 {
1719 * These methods take the same argument forms as `Kernel.system`.
1820 * See `KernelSystemCall` for details.
1921 */
20- class Open3Call extends SystemCommandExecution:: Range {
21- MethodCall methodCall ;
22-
22+ class Open3Call extends SystemCommandExecution:: Range instanceof DataFlow:: CallNode {
2323 Open3Call ( ) {
24- this .asExpr ( ) .getExpr ( ) = methodCall and
2524 this =
2625 API:: getTopLevelMember ( "Open3" )
2726 .getAMethodCall ( [ "popen3" , "popen2" , "popen2e" , "capture3" , "capture2" , "capture2e" ] )
2827 }
2928
30- override DataFlow:: Node getAnArgument ( ) {
31- result .asExpr ( ) .getExpr ( ) = methodCall .getAnArgument ( )
32- }
29+ override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
3330
3431 override predicate isShellInterpreted ( DataFlow:: Node arg ) {
3532 // These Open3 methods invoke a subshell if you provide a single string as argument
36- methodCall .getNumberOfArguments ( ) = 1 and arg .asExpr ( ) .getExpr ( ) = methodCall .getAnArgument ( )
33+ super .getNumberOfArguments ( ) = 1 and
34+ arg = this .getAnArgument ( )
3735 }
3836 }
3937
@@ -47,26 +45,21 @@ module Open3 {
4745 * Open3.pipeline([{}, "cat", "foo.txt"], "tail")
4846 * Open3.pipeline([["cat", "cat"], "foo.txt"], "tail")
4947 */
50- class Open3PipelineCall extends SystemCommandExecution:: Range {
51- MethodCall methodCall ;
52-
48+ class Open3PipelineCall extends SystemCommandExecution:: Range instanceof DataFlow:: CallNode {
5349 Open3PipelineCall ( ) {
54- this .asExpr ( ) .getExpr ( ) = methodCall and
5550 this =
5651 API:: getTopLevelMember ( "Open3" )
5752 .getAMethodCall ( [
5853 "pipeline_rw" , "pipeline_r" , "pipeline_w" , "pipeline_start" , "pipeline"
5954 ] )
6055 }
6156
62- override DataFlow:: Node getAnArgument ( ) {
63- result .asExpr ( ) .getExpr ( ) = methodCall .getAnArgument ( )
64- }
57+ override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
6558
6659 override predicate isShellInterpreted ( DataFlow:: Node arg ) {
6760 // A command in the pipeline is executed in a subshell if it is given as a single string argument.
6861 arg .asExpr ( ) .getExpr ( ) instanceof StringlikeLiteral and
69- arg . asExpr ( ) . getExpr ( ) = methodCall .getAnArgument ( )
62+ arg = this .getAnArgument ( )
7063 }
7164 }
7265}
0 commit comments