Skip to content

Commit 00566f0

Browse files
committed
Python: Extend DataFlow::CfgNode when appropriate
1 parent 6a3aed3 commit 00566f0

File tree

1 file changed

+35
-38
lines changed
  • python/ql/src/experimental/semmle/python/frameworks

1 file changed

+35
-38
lines changed

python/ql/src/experimental/semmle/python/frameworks/Stdlib.qll

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -102,74 +102,71 @@ private module Stdlib {
102102
* A call to `os.system`.
103103
* See https://docs.python.org/3/library/os.html#os.system
104104
*/
105-
private class OsSystemCall extends SystemCommandExecution::Range {
106-
OsSystemCall() { this.asCfgNode().(CallNode).getFunction() = os_attr("system").asCfgNode() }
105+
private class OsSystemCall extends SystemCommandExecution::Range, DataFlow::CfgNode {
106+
override CallNode node;
107107

108-
override DataFlow::Node getCommand() {
109-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(0)
110-
}
108+
OsSystemCall() { node.getFunction() = os_attr("system").asCfgNode() }
109+
110+
override DataFlow::Node getCommand() { result.asCfgNode() = node.getArg(0) }
111111
}
112112

113113
/**
114114
* A call to `os.popen`
115115
* See https://docs.python.org/3/library/os.html#os.popen
116116
*/
117-
private class OsPopenCall extends SystemCommandExecution::Range {
118-
OsPopenCall() { this.asCfgNode().(CallNode).getFunction() = os_attr("popen").asCfgNode() }
117+
private class OsPopenCall extends SystemCommandExecution::Range, DataFlow::CfgNode {
118+
override CallNode node;
119119

120-
override DataFlow::Node getCommand() {
121-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(0)
122-
}
120+
OsPopenCall() { node.getFunction() = os_attr("popen").asCfgNode() }
121+
122+
override DataFlow::Node getCommand() { result.asCfgNode() = node.getArg(0) }
123123
}
124124

125125
/**
126126
* A call to any of the `os.exec*` functions
127127
* See https://docs.python.org/3.8/library/os.html#os.execl
128128
*/
129-
private class OsExecCall extends SystemCommandExecution::Range {
129+
private class OsExecCall extends SystemCommandExecution::Range, DataFlow::CfgNode {
130+
override CallNode node;
131+
130132
OsExecCall() {
131133
exists(string name |
132134
name in ["execl", "execle", "execlp", "execlpe", "execv", "execve", "execvp", "execvpe"] and
133-
this.asCfgNode().(CallNode).getFunction() = os_attr(name).asCfgNode()
135+
node.getFunction() = os_attr(name).asCfgNode()
134136
)
135137
}
136138

137-
override DataFlow::Node getCommand() {
138-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(0)
139-
}
139+
override DataFlow::Node getCommand() { result.asCfgNode() = node.getArg(0) }
140140
}
141141

142142
/**
143143
* A call to any of the `os.spawn*` functions
144144
* See https://docs.python.org/3.8/library/os.html#os.spawnl
145145
*/
146-
private class OsSpawnCall extends SystemCommandExecution::Range {
146+
private class OsSpawnCall extends SystemCommandExecution::Range, DataFlow::CfgNode {
147+
override CallNode node;
148+
147149
OsSpawnCall() {
148150
exists(string name |
149151
name in ["spawnl", "spawnle", "spawnlp", "spawnlpe", "spawnv", "spawnve", "spawnvp",
150152
"spawnvpe"] and
151-
this.asCfgNode().(CallNode).getFunction() = os_attr(name).asCfgNode()
153+
node.getFunction() = os_attr(name).asCfgNode()
152154
)
153155
}
154156

155-
override DataFlow::Node getCommand() {
156-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(1)
157-
}
157+
override DataFlow::Node getCommand() { result.asCfgNode() = node.getArg(1) }
158158
}
159159

160160
/**
161161
* A call to any of the `os.posix_spawn*` functions
162162
* See https://docs.python.org/3.8/library/os.html#os.posix_spawn
163163
*/
164-
private class OsPosixSpawnCall extends SystemCommandExecution::Range {
165-
OsPosixSpawnCall() {
166-
this.asCfgNode().(CallNode).getFunction() =
167-
os_attr(["posix_spawn", "posix_spawnp"]).asCfgNode()
168-
}
164+
private class OsPosixSpawnCall extends SystemCommandExecution::Range, DataFlow::CfgNode {
165+
override CallNode node;
169166

170-
override DataFlow::Node getCommand() {
171-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(0)
172-
}
167+
OsPosixSpawnCall() { node.getFunction() = os_attr(["posix_spawn", "posix_spawnp"]).asCfgNode() }
168+
169+
override DataFlow::Node getCommand() { result.asCfgNode() = node.getArg(0) }
173170
}
174171

175172
/** An additional taint step for calls to `os.path.join` */
@@ -363,14 +360,14 @@ private module Stdlib {
363360
* A call to `marshal.loads`
364361
* See https://docs.python.org/3/library/marshal.html#marshal.loads
365362
*/
366-
private class MarshalLoadsCall extends Decoding::Range {
367-
MarshalLoadsCall() { this.asCfgNode().(CallNode).getFunction() = marshal::loads().asCfgNode() }
363+
private class MarshalLoadsCall extends Decoding::Range, DataFlow::CfgNode {
364+
override CallNode node;
365+
366+
MarshalLoadsCall() { node.getFunction() = marshal::loads().asCfgNode() }
368367

369368
override predicate unsafe() { any() }
370369

371-
override DataFlow::Node getAnInput() {
372-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(0)
373-
}
370+
override DataFlow::Node getAnInput() { result.asCfgNode() = node.getArg(0) }
374371

375372
override DataFlow::Node getOutput() { result = this }
376373

@@ -414,14 +411,14 @@ private module Stdlib {
414411
* A call to `pickle.loads`
415412
* See https://docs.python.org/3/library/pickle.html#pickle.loads
416413
*/
417-
private class PickleLoadsCall extends Decoding::Range {
418-
PickleLoadsCall() { this.asCfgNode().(CallNode).getFunction() = pickle::loads().asCfgNode() }
414+
private class PickleLoadsCall extends Decoding::Range, DataFlow::CfgNode {
415+
override CallNode node;
416+
417+
PickleLoadsCall() { node.getFunction() = pickle::loads().asCfgNode() }
419418

420419
override predicate unsafe() { any() }
421420

422-
override DataFlow::Node getAnInput() {
423-
result.asCfgNode() = this.asCfgNode().(CallNode).getArg(0)
424-
}
421+
override DataFlow::Node getAnInput() { result.asCfgNode() = node.getArg(0) }
425422

426423
override DataFlow::Node getOutput() { result = this }
427424

0 commit comments

Comments
 (0)