Skip to content

Commit 350a68d

Browse files
yoffCopilot
andcommitted
Python: migrate remaining query-side files to new Cfg::
Four library/query files still referenced the legacy Flow.qll `ControlFlowNode` and friends, which no longer match the dataflow library's `Cfg::ControlFlowNode`: - SubclassFinder.qll: type `value` as `Cfg::ControlFlowNode`. - ExceptionInfo.qll: replace `EssaNodeDefinition.getDefiningNode()` filter with `Cfg::NameNode.defines(_)` (the legacy ESSA class isn't reachable through the new dataflow API at the query-pack layer). - ServerSideRequestForgeryCustomizations.qll: qualify `BinaryExprNode` with `Cfg::` and update `stringRestriction` to take `Cfg::ControlFlowNode`. - TarSlipCustomizations.qll: qualify `CallNode`/`AttrNode`/`NameNode` and the `tarFileInfoSanitizer` parameter with `Cfg::`. The three reblessed `.expected` files are purely cosmetic toString churn ("ControlFlowNode for X" -> "X", "After X"); verified set-equal after normalising the toString prefixes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c91b6c9 commit 350a68d

7 files changed

Lines changed: 742 additions & 736 deletions

File tree

python/ql/lib/semmle/python/frameworks/internal/SubclassFinder.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import semmle.python.dataflow.new.internal.ImportResolution
1111
private import semmle.python.ApiGraphs
1212
private import semmle.python.filters.Tests
1313
private import semmle.python.Module
14+
private import semmle.python.controlflow.internal.Cfg as Cfg
1415

1516
// very much inspired by the draft at https://github.com/github/codeql/pull/5632
1617
module NotExposed {
@@ -206,7 +207,7 @@ module NotExposed {
206207
string relevantName, Location loc
207208
) {
208209
loc = mod.getLocation() and
209-
exists(API::Node relevantClass, ControlFlowNode value |
210+
exists(API::Node relevantClass, Cfg::ControlFlowNode value |
210211
relevantClass = newOrExistingModeling(spec).getASubclass*() and
211212
ImportResolution::module_export(mod, relevantName, def) and
212213
value = relevantClass.getAValueReachableFromSource().asCfgNode() and

python/ql/lib/semmle/python/security/dataflow/ExceptionInfo.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import python
44
import semmle.python.dataflow.new.DataFlow
55
private import semmle.python.ApiGraphs
6+
private import semmle.python.controlflow.internal.Cfg as Cfg
67

78
/**
89
* INTERNAL: Do not use.
@@ -29,7 +30,7 @@ private class TracebackFunctionCall extends ExceptionInfo, DataFlow::CallCfgNode
2930
private class CaughtException extends ExceptionInfo {
3031
CaughtException() {
3132
this.asExpr() = any(ExceptStmt s).getName() and
32-
this.asCfgNode() = any(EssaNodeDefinition def).getDefiningNode()
33+
this.asCfgNode().(Cfg::NameNode).defines(_)
3334
}
3435
}
3536

python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryCustomizations.qll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ private import semmle.python.dataflow.new.RemoteFlowSources
1111
private import semmle.python.dataflow.new.BarrierGuards
1212
private import semmle.python.ApiGraphs
1313
private import semmle.python.frameworks.data.internal.ApiGraphModels
14+
private import semmle.python.controlflow.internal.Cfg as Cfg
1415

1516
/**
1617
* Provides default sources, sinks and sanitizers for detecting
@@ -95,7 +96,7 @@ module ServerSideRequestForgery {
9596
class StringConstructionAsFullUrlControlSanitizer extends FullUrlControlSanitizer {
9697
StringConstructionAsFullUrlControlSanitizer() {
9798
// string concat
98-
exists(BinaryExprNode add |
99+
exists(Cfg::BinaryExprNode add |
99100
add.getOp() instanceof Add and
100101
add.getRight() = this.asCfgNode() and
101102
not add.getLeft().getNode().(StringLiteral).getText().toLowerCase() in [
@@ -104,7 +105,7 @@ module ServerSideRequestForgery {
104105
)
105106
or
106107
// % formatting
107-
exists(BinaryExprNode fmt |
108+
exists(Cfg::BinaryExprNode fmt |
108109
fmt.getOp() instanceof Mod and
109110
fmt.getRight() = this.asCfgNode() and
110111
// detecting %-formatting is not super easy, so we simplify it to only handle
@@ -155,7 +156,9 @@ module ServerSideRequestForgery {
155156
}
156157
}
157158

158-
private predicate stringRestriction(DataFlow::GuardNode g, ControlFlowNode node, boolean branch) {
159+
private predicate stringRestriction(
160+
DataFlow::GuardNode g, Cfg::ControlFlowNode node, boolean branch
161+
) {
159162
exists(DataFlow::MethodCallNode call, DataFlow::Node strNode |
160163
call.asCfgNode() = g and strNode.asCfgNode() = node
161164
|

python/ql/lib/semmle/python/security/dataflow/TarSlipCustomizations.qll

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ private import semmle.python.dataflow.new.DataFlow
99
private import semmle.python.Concepts
1010
private import semmle.python.dataflow.new.BarrierGuards
1111
private import semmle.python.ApiGraphs
12+
private import semmle.python.controlflow.internal.Cfg as Cfg
1213

1314
/**
1415
* Provides default sources, sinks and sanitizers for detecting
@@ -139,18 +140,18 @@ module TarSlip {
139140
* where `<check_path>` is any function matching `"%path"`.
140141
* `info` is assumed to be a `TarInfo` instance.
141142
*/
142-
predicate tarFileInfoSanitizer(DataFlow::GuardNode g, ControlFlowNode tarInfo, boolean branch) {
143-
exists(CallNode call, AttrNode attr |
143+
predicate tarFileInfoSanitizer(DataFlow::GuardNode g, Cfg::ControlFlowNode tarInfo, boolean branch) {
144+
exists(Cfg::CallNode call, Cfg::AttrNode attr |
144145
g = call and
145146
// We must test the name of the tar info object.
146147
attr = call.getAnArg() and
147148
attr.getName() = "name" and
148149
attr.getObject() = tarInfo
149150
|
150151
// The assumption that any test that matches %path is a sanitizer might be too broad.
151-
call.getAChild*().(AttrNode).getName().matches("%path")
152+
call.getAChild*().(Cfg::AttrNode).getName().matches("%path")
152153
or
153-
call.getAChild*().(NameNode).getId().matches("%path")
154+
call.getAChild*().(Cfg::NameNode).getId().matches("%path")
154155
) and
155156
branch = false
156157
}
Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,66 @@
11
edges
2-
| tarslip.py:14:1:14:3 | ControlFlowNode for tar | tarslip.py:15:1:15:3 | ControlFlowNode for tar | provenance | |
3-
| tarslip.py:14:7:14:39 | ControlFlowNode for Attribute() | tarslip.py:14:1:14:3 | ControlFlowNode for tar | provenance | |
4-
| tarslip.py:18:1:18:3 | ControlFlowNode for tar | tarslip.py:19:5:19:9 | ControlFlowNode for entry | provenance | |
5-
| tarslip.py:18:7:18:39 | ControlFlowNode for Attribute() | tarslip.py:18:1:18:3 | ControlFlowNode for tar | provenance | |
6-
| tarslip.py:19:5:19:9 | ControlFlowNode for entry | tarslip.py:20:17:20:21 | ControlFlowNode for entry | provenance | |
7-
| tarslip.py:35:1:35:3 | ControlFlowNode for tar | tarslip.py:36:5:36:9 | ControlFlowNode for entry | provenance | |
8-
| tarslip.py:35:7:35:39 | ControlFlowNode for Attribute() | tarslip.py:35:1:35:3 | ControlFlowNode for tar | provenance | |
9-
| tarslip.py:36:5:36:9 | ControlFlowNode for entry | tarslip.py:39:17:39:21 | ControlFlowNode for entry | provenance | |
10-
| tarslip.py:42:1:42:3 | ControlFlowNode for tar | tarslip.py:43:24:43:26 | ControlFlowNode for tar | provenance | |
11-
| tarslip.py:42:7:42:39 | ControlFlowNode for Attribute() | tarslip.py:42:1:42:3 | ControlFlowNode for tar | provenance | |
12-
| tarslip.py:58:1:58:3 | ControlFlowNode for tar | tarslip.py:59:5:59:9 | ControlFlowNode for entry | provenance | |
13-
| tarslip.py:58:7:58:39 | ControlFlowNode for Attribute() | tarslip.py:58:1:58:3 | ControlFlowNode for tar | provenance | |
14-
| tarslip.py:59:5:59:9 | ControlFlowNode for entry | tarslip.py:61:21:61:25 | ControlFlowNode for entry | provenance | |
15-
| tarslip.py:90:1:90:3 | ControlFlowNode for tar | tarslip.py:91:1:91:3 | ControlFlowNode for tar | provenance | |
16-
| tarslip.py:90:7:90:39 | ControlFlowNode for Attribute() | tarslip.py:90:1:90:3 | ControlFlowNode for tar | provenance | |
17-
| tarslip.py:94:1:94:3 | ControlFlowNode for tar | tarslip.py:95:5:95:9 | ControlFlowNode for entry | provenance | |
18-
| tarslip.py:94:7:94:39 | ControlFlowNode for Attribute() | tarslip.py:94:1:94:3 | ControlFlowNode for tar | provenance | |
19-
| tarslip.py:95:5:95:9 | ControlFlowNode for entry | tarslip.py:96:17:96:21 | ControlFlowNode for entry | provenance | |
20-
| tarslip.py:109:1:109:3 | ControlFlowNode for tar | tarslip.py:110:1:110:3 | ControlFlowNode for tar | provenance | |
21-
| tarslip.py:109:7:109:39 | ControlFlowNode for Attribute() | tarslip.py:109:1:109:3 | ControlFlowNode for tar | provenance | |
22-
| tarslip.py:112:1:112:3 | ControlFlowNode for tar | tarslip.py:113:24:113:26 | ControlFlowNode for tar | provenance | |
23-
| tarslip.py:112:7:112:39 | ControlFlowNode for Attribute() | tarslip.py:112:1:112:3 | ControlFlowNode for tar | provenance | |
2+
| tarslip.py:14:1:14:3 | tar | tarslip.py:15:1:15:3 | tar | provenance | |
3+
| tarslip.py:14:7:14:39 | After Attribute() | tarslip.py:14:1:14:3 | tar | provenance | |
4+
| tarslip.py:18:1:18:3 | tar | tarslip.py:19:5:19:9 | entry | provenance | |
5+
| tarslip.py:18:7:18:39 | After Attribute() | tarslip.py:18:1:18:3 | tar | provenance | |
6+
| tarslip.py:19:5:19:9 | entry | tarslip.py:20:17:20:21 | entry | provenance | |
7+
| tarslip.py:35:1:35:3 | tar | tarslip.py:36:5:36:9 | entry | provenance | |
8+
| tarslip.py:35:7:35:39 | After Attribute() | tarslip.py:35:1:35:3 | tar | provenance | |
9+
| tarslip.py:36:5:36:9 | entry | tarslip.py:39:17:39:21 | entry | provenance | |
10+
| tarslip.py:42:1:42:3 | tar | tarslip.py:43:24:43:26 | tar | provenance | |
11+
| tarslip.py:42:7:42:39 | After Attribute() | tarslip.py:42:1:42:3 | tar | provenance | |
12+
| tarslip.py:58:1:58:3 | tar | tarslip.py:59:5:59:9 | entry | provenance | |
13+
| tarslip.py:58:7:58:39 | After Attribute() | tarslip.py:58:1:58:3 | tar | provenance | |
14+
| tarslip.py:59:5:59:9 | entry | tarslip.py:61:21:61:25 | entry | provenance | |
15+
| tarslip.py:90:1:90:3 | tar | tarslip.py:91:1:91:3 | tar | provenance | |
16+
| tarslip.py:90:7:90:39 | After Attribute() | tarslip.py:90:1:90:3 | tar | provenance | |
17+
| tarslip.py:94:1:94:3 | tar | tarslip.py:95:5:95:9 | entry | provenance | |
18+
| tarslip.py:94:7:94:39 | After Attribute() | tarslip.py:94:1:94:3 | tar | provenance | |
19+
| tarslip.py:95:5:95:9 | entry | tarslip.py:96:17:96:21 | entry | provenance | |
20+
| tarslip.py:109:1:109:3 | tar | tarslip.py:110:1:110:3 | tar | provenance | |
21+
| tarslip.py:109:7:109:39 | After Attribute() | tarslip.py:109:1:109:3 | tar | provenance | |
22+
| tarslip.py:112:1:112:3 | tar | tarslip.py:113:24:113:26 | tar | provenance | |
23+
| tarslip.py:112:7:112:39 | After Attribute() | tarslip.py:112:1:112:3 | tar | provenance | |
2424
nodes
25-
| tarslip.py:14:1:14:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
26-
| tarslip.py:14:7:14:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
27-
| tarslip.py:15:1:15:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
28-
| tarslip.py:18:1:18:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
29-
| tarslip.py:18:7:18:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
30-
| tarslip.py:19:5:19:9 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
31-
| tarslip.py:20:17:20:21 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
32-
| tarslip.py:35:1:35:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
33-
| tarslip.py:35:7:35:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
34-
| tarslip.py:36:5:36:9 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
35-
| tarslip.py:39:17:39:21 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
36-
| tarslip.py:42:1:42:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
37-
| tarslip.py:42:7:42:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
38-
| tarslip.py:43:24:43:26 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
39-
| tarslip.py:58:1:58:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
40-
| tarslip.py:58:7:58:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
41-
| tarslip.py:59:5:59:9 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
42-
| tarslip.py:61:21:61:25 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
43-
| tarslip.py:90:1:90:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
44-
| tarslip.py:90:7:90:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
45-
| tarslip.py:91:1:91:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
46-
| tarslip.py:94:1:94:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
47-
| tarslip.py:94:7:94:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
48-
| tarslip.py:95:5:95:9 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
49-
| tarslip.py:96:17:96:21 | ControlFlowNode for entry | semmle.label | ControlFlowNode for entry |
50-
| tarslip.py:109:1:109:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
51-
| tarslip.py:109:7:109:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
52-
| tarslip.py:110:1:110:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
53-
| tarslip.py:112:1:112:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
54-
| tarslip.py:112:7:112:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() |
55-
| tarslip.py:113:24:113:26 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar |
25+
| tarslip.py:14:1:14:3 | tar | semmle.label | tar |
26+
| tarslip.py:14:7:14:39 | After Attribute() | semmle.label | After Attribute() |
27+
| tarslip.py:15:1:15:3 | tar | semmle.label | tar |
28+
| tarslip.py:18:1:18:3 | tar | semmle.label | tar |
29+
| tarslip.py:18:7:18:39 | After Attribute() | semmle.label | After Attribute() |
30+
| tarslip.py:19:5:19:9 | entry | semmle.label | entry |
31+
| tarslip.py:20:17:20:21 | entry | semmle.label | entry |
32+
| tarslip.py:35:1:35:3 | tar | semmle.label | tar |
33+
| tarslip.py:35:7:35:39 | After Attribute() | semmle.label | After Attribute() |
34+
| tarslip.py:36:5:36:9 | entry | semmle.label | entry |
35+
| tarslip.py:39:17:39:21 | entry | semmle.label | entry |
36+
| tarslip.py:42:1:42:3 | tar | semmle.label | tar |
37+
| tarslip.py:42:7:42:39 | After Attribute() | semmle.label | After Attribute() |
38+
| tarslip.py:43:24:43:26 | tar | semmle.label | tar |
39+
| tarslip.py:58:1:58:3 | tar | semmle.label | tar |
40+
| tarslip.py:58:7:58:39 | After Attribute() | semmle.label | After Attribute() |
41+
| tarslip.py:59:5:59:9 | entry | semmle.label | entry |
42+
| tarslip.py:61:21:61:25 | entry | semmle.label | entry |
43+
| tarslip.py:90:1:90:3 | tar | semmle.label | tar |
44+
| tarslip.py:90:7:90:39 | After Attribute() | semmle.label | After Attribute() |
45+
| tarslip.py:91:1:91:3 | tar | semmle.label | tar |
46+
| tarslip.py:94:1:94:3 | tar | semmle.label | tar |
47+
| tarslip.py:94:7:94:39 | After Attribute() | semmle.label | After Attribute() |
48+
| tarslip.py:95:5:95:9 | entry | semmle.label | entry |
49+
| tarslip.py:96:17:96:21 | entry | semmle.label | entry |
50+
| tarslip.py:109:1:109:3 | tar | semmle.label | tar |
51+
| tarslip.py:109:7:109:39 | After Attribute() | semmle.label | After Attribute() |
52+
| tarslip.py:110:1:110:3 | tar | semmle.label | tar |
53+
| tarslip.py:112:1:112:3 | tar | semmle.label | tar |
54+
| tarslip.py:112:7:112:39 | After Attribute() | semmle.label | After Attribute() |
55+
| tarslip.py:113:24:113:26 | tar | semmle.label | tar |
5656
subpaths
5757
#select
58-
| tarslip.py:15:1:15:3 | ControlFlowNode for tar | tarslip.py:14:7:14:39 | ControlFlowNode for Attribute() | tarslip.py:15:1:15:3 | ControlFlowNode for tar | This file extraction depends on a $@. | tarslip.py:14:7:14:39 | ControlFlowNode for Attribute() | potentially untrusted source |
59-
| tarslip.py:20:17:20:21 | ControlFlowNode for entry | tarslip.py:18:7:18:39 | ControlFlowNode for Attribute() | tarslip.py:20:17:20:21 | ControlFlowNode for entry | This file extraction depends on a $@. | tarslip.py:18:7:18:39 | ControlFlowNode for Attribute() | potentially untrusted source |
60-
| tarslip.py:39:17:39:21 | ControlFlowNode for entry | tarslip.py:35:7:35:39 | ControlFlowNode for Attribute() | tarslip.py:39:17:39:21 | ControlFlowNode for entry | This file extraction depends on a $@. | tarslip.py:35:7:35:39 | ControlFlowNode for Attribute() | potentially untrusted source |
61-
| tarslip.py:43:24:43:26 | ControlFlowNode for tar | tarslip.py:42:7:42:39 | ControlFlowNode for Attribute() | tarslip.py:43:24:43:26 | ControlFlowNode for tar | This file extraction depends on a $@. | tarslip.py:42:7:42:39 | ControlFlowNode for Attribute() | potentially untrusted source |
62-
| tarslip.py:61:21:61:25 | ControlFlowNode for entry | tarslip.py:58:7:58:39 | ControlFlowNode for Attribute() | tarslip.py:61:21:61:25 | ControlFlowNode for entry | This file extraction depends on a $@. | tarslip.py:58:7:58:39 | ControlFlowNode for Attribute() | potentially untrusted source |
63-
| tarslip.py:91:1:91:3 | ControlFlowNode for tar | tarslip.py:90:7:90:39 | ControlFlowNode for Attribute() | tarslip.py:91:1:91:3 | ControlFlowNode for tar | This file extraction depends on a $@. | tarslip.py:90:7:90:39 | ControlFlowNode for Attribute() | potentially untrusted source |
64-
| tarslip.py:96:17:96:21 | ControlFlowNode for entry | tarslip.py:94:7:94:39 | ControlFlowNode for Attribute() | tarslip.py:96:17:96:21 | ControlFlowNode for entry | This file extraction depends on a $@. | tarslip.py:94:7:94:39 | ControlFlowNode for Attribute() | potentially untrusted source |
65-
| tarslip.py:110:1:110:3 | ControlFlowNode for tar | tarslip.py:109:7:109:39 | ControlFlowNode for Attribute() | tarslip.py:110:1:110:3 | ControlFlowNode for tar | This file extraction depends on a $@. | tarslip.py:109:7:109:39 | ControlFlowNode for Attribute() | potentially untrusted source |
66-
| tarslip.py:113:24:113:26 | ControlFlowNode for tar | tarslip.py:112:7:112:39 | ControlFlowNode for Attribute() | tarslip.py:113:24:113:26 | ControlFlowNode for tar | This file extraction depends on a $@. | tarslip.py:112:7:112:39 | ControlFlowNode for Attribute() | potentially untrusted source |
58+
| tarslip.py:15:1:15:3 | tar | tarslip.py:14:7:14:39 | After Attribute() | tarslip.py:15:1:15:3 | tar | This file extraction depends on a $@. | tarslip.py:14:7:14:39 | After Attribute() | potentially untrusted source |
59+
| tarslip.py:20:17:20:21 | entry | tarslip.py:18:7:18:39 | After Attribute() | tarslip.py:20:17:20:21 | entry | This file extraction depends on a $@. | tarslip.py:18:7:18:39 | After Attribute() | potentially untrusted source |
60+
| tarslip.py:39:17:39:21 | entry | tarslip.py:35:7:35:39 | After Attribute() | tarslip.py:39:17:39:21 | entry | This file extraction depends on a $@. | tarslip.py:35:7:35:39 | After Attribute() | potentially untrusted source |
61+
| tarslip.py:43:24:43:26 | tar | tarslip.py:42:7:42:39 | After Attribute() | tarslip.py:43:24:43:26 | tar | This file extraction depends on a $@. | tarslip.py:42:7:42:39 | After Attribute() | potentially untrusted source |
62+
| tarslip.py:61:21:61:25 | entry | tarslip.py:58:7:58:39 | After Attribute() | tarslip.py:61:21:61:25 | entry | This file extraction depends on a $@. | tarslip.py:58:7:58:39 | After Attribute() | potentially untrusted source |
63+
| tarslip.py:91:1:91:3 | tar | tarslip.py:90:7:90:39 | After Attribute() | tarslip.py:91:1:91:3 | tar | This file extraction depends on a $@. | tarslip.py:90:7:90:39 | After Attribute() | potentially untrusted source |
64+
| tarslip.py:96:17:96:21 | entry | tarslip.py:94:7:94:39 | After Attribute() | tarslip.py:96:17:96:21 | entry | This file extraction depends on a $@. | tarslip.py:94:7:94:39 | After Attribute() | potentially untrusted source |
65+
| tarslip.py:110:1:110:3 | tar | tarslip.py:109:7:109:39 | After Attribute() | tarslip.py:110:1:110:3 | tar | This file extraction depends on a $@. | tarslip.py:109:7:109:39 | After Attribute() | potentially untrusted source |
66+
| tarslip.py:113:24:113:26 | tar | tarslip.py:112:7:112:39 | After Attribute() | tarslip.py:113:24:113:26 | tar | This file extraction depends on a $@. | tarslip.py:112:7:112:39 | After Attribute() | potentially untrusted source |

0 commit comments

Comments
 (0)