Skip to content

Commit fad9133

Browse files
committed
PS: Add a read step out of property name parameter nodes.
1 parent 87cc9cd commit fad9133

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ module SsaFlow {
8484
}
8585

8686
predicate localFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
87-
Impl::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep)
87+
Impl::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep) and
88+
// Flow out of property name parameter nodes are covered by `readStep`.
89+
not nodeFrom instanceof PipelineByPropertyNameParameter
8890
}
8991

9092
predicate localMustFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
@@ -485,7 +487,7 @@ private module ParameterNodes {
485487
)
486488
)
487489
or
488-
parameter.isPipeline() and
490+
(parameter.isPipeline() or parameter.isPipelineByPropertyName()) and
489491
pos.isPipeline()
490492
)
491493
}
@@ -498,6 +500,12 @@ private module ParameterNodes {
498500

499501
override string toStringImpl() { result = parameter.toString() }
500502
}
503+
504+
class PipelineByPropertyNameParameter extends NormalParameterNode {
505+
PipelineByPropertyNameParameter() { this.getParameter().isPipelineByPropertyName() }
506+
507+
string getPropretyName() { result = this.getParameter().getName() }
508+
}
501509
}
502510

503511
import ParameterNodes
@@ -749,6 +757,13 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
749757
node1.(ProcessNode).getIteratorVariable() = def.getSourceVariable() and
750758
SsaImpl::firstRead(def, node2.asExpr())
751759
)
760+
or
761+
exists(Content::KnownElementContent ec, SsaImpl::DefinitionExt def |
762+
c.isSingleton(ec) and
763+
node1.(PipelineByPropertyNameParameter).getPropretyName() = ec.getIndex().asString() and
764+
def.getSourceVariable() = node1.(PipelineByPropertyNameParameter).getParameter() and
765+
SsaImpl::firstRead(def, node2.asExpr())
766+
)
752767
}
753768

754769
/**
@@ -777,6 +792,11 @@ predicate expectsContent(Node n, ContentSet c) {
777792
or
778793
n instanceof ProcessNode and
779794
c.isAnyElement()
795+
or
796+
exists(Content::KnownElementContent ec |
797+
ec.getIndex().asString() = n.(PipelineByPropertyNameParameter).getPropretyName() and
798+
c.isSingleton(ec)
799+
)
780800
}
781801

782802
class DataFlowType extends TDataFlowType {

0 commit comments

Comments
 (0)