Skip to content

Commit b2cf155

Browse files
committed
PS: Define pre-return node and implicit-wrapping nodes using the script block instead of the individual elements.
1 parent ee8c586 commit b2cf155

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPrivate.qll

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ module LocalFlow {
131131
nodeTo = TReturnNodeImpl(cfgNode.getScope())
132132
)
133133
or
134-
exists(CfgNode cfgNode |
135-
cfgNode = nodeFrom.(AstNode).getCfgNode() and
136-
isUniqueReturned(cfgNode) and
137-
nodeTo.(ReturnNodeImpl).getCfgScope() = cfgNode.getScope()
134+
exists(CfgNodes::ExprCfgNode e, CfgNodes::ScriptBlockCfgNode scriptBlock |
135+
e = nodeFrom.(AstNode).getCfgNode() and
136+
isReturned(e) and
137+
e.getScope() = scriptBlock.getAstNode() and
138+
not blockMayReturnMultipleValues(scriptBlock) and
139+
nodeTo.(ReturnNodeImpl).getCfgScope() = scriptBlock.getAstNode()
138140
)
139141
}
140142

@@ -1082,12 +1084,12 @@ private import PostUpdateNodes
10821084
* (or statement) is being returned from a function.
10831085
*/
10841086
private class ImplicitWrapNode extends TImplicitWrapNode, NodeImpl {
1085-
private CfgNodes::AstCfgNode n;
1087+
private CfgNodes::ScriptBlockCfgNode n;
10861088
private boolean shouldWrap;
10871089

10881090
ImplicitWrapNode() { this = TImplicitWrapNode(n, shouldWrap) }
10891091

1090-
CfgNodes::AstCfgNode getReturnedNode() { result = n }
1092+
CfgNodes::ScriptBlockCfgNode getScriptBlock() { result = n }
10911093

10921094
predicate shouldWrap() { shouldWrap = true }
10931095

@@ -1105,12 +1107,12 @@ private class ImplicitWrapNode extends TImplicitWrapNode, NodeImpl {
11051107
* has been performed.
11061108
*/
11071109
private class PreReturNodeImpl extends TPreReturnNodeImpl, NodeImpl {
1108-
private CfgNodes::AstCfgNode n;
1110+
private CfgNodes::ScriptBlockCfgNode n;
11091111
private boolean isArray;
11101112

11111113
PreReturNodeImpl() { this = TPreReturnNodeImpl(n, isArray) }
11121114

1113-
CfgNodes::AstCfgNode getReturnedNode() { result = n }
1115+
CfgNodes::AstCfgNode getScriptBlock() { result = n }
11141116

11151117
override CfgScope getCfgScope() { result = n.getScope() }
11161118

0 commit comments

Comments
 (0)