Skip to content

Commit 87cc9cd

Browse files
committed
PS: Also ignore pipeline property name parameters in the pipeline-related predicates.
1 parent 1dcd318 commit 87cc9cd

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

powershell/ql/lib/semmle/code/powershell/Function.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ abstract private class AbstractFunction extends Ast {
5151
result.getIndex() = i
5252
}
5353

54-
final Parameter getParameterExcludingPipline(int i) {
54+
final Parameter getParameterExcludingPiplines(int i) {
5555
result = this.getFunctionParameter(i)
5656
or
57-
result = this.getBody().getParamBlock().getParameterExcludingPipline(i)
57+
result = this.getBody().getParamBlock().getParameterExcludingPiplines(i)
5858
}
5959

6060
final Parameter getThisParameter() {

powershell/ql/lib/semmle/code/powershell/NamedAttributeArgument.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ class NamedAttributeArgument extends @named_attribute_argument, Ast {
1313
class ValueFromPipelineAttribute extends NamedAttributeArgument {
1414
ValueFromPipelineAttribute() { this.getName() = "ValueFromPipeline" }
1515
}
16+
17+
class ValueFromPipelineByPropertyName extends NamedAttributeArgument {
18+
ValueFromPipelineByPropertyName() { this.getName() = "ValueFromPipelineByPropertyName" }
19+
}

powershell/ql/lib/semmle/code/powershell/ParamBlock.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class ParamBlock extends @param_block, Ast {
1515

1616
Parameter getParameter(int i) { result.hasParameterBlock(this, i) }
1717

18-
Parameter getParameterExcludingPipline(int i) { result.hasParameterBlockExcludingPipeline(this, i) }
18+
Parameter getParameterExcludingPiplines(int i) { result.hasParameterBlockExcludingPipelines(this, i) }
1919

2020
Parameter getAParameter() { result = this.getParameter(_) }
2121
}

powershell/ql/lib/semmle/code/powershell/Variable.qll

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ private predicate hasParameterBlockImpl(Internal::Parameter p, ParamBlock block,
1010
param_block_parameter(block, i, p)
1111
}
1212

13-
private predicate hasParameterBlockExcludingPipelineImpl(
13+
private predicate hasParameterBlockExcludingPipelinesImpl(
1414
Internal::Parameter p, ParamBlock block, int i
1515
) {
1616
p =
1717
rank[i + 1](Internal::Parameter cand, int j |
1818
hasParameterBlockImpl(cand, block, j) and
1919
not cand.getAnAttribute().(Attribute).getANamedArgument() instanceof
20-
ValueFromPipelineAttribute
20+
ValueFromPipelineAttribute and
21+
not cand.getAnAttribute().(Attribute).getANamedArgument() instanceof
22+
ValueFromPipelineByPropertyName
2123
|
2224
cand order by j
2325
)
@@ -69,7 +71,7 @@ private class ParameterImpl extends TParameterImpl {
6971

7072
predicate hasParameterBlock(ParamBlock block, int i) { none() }
7173

72-
predicate hasParameterBlockExcludingPipeline(ParamBlock block, int i) { none() }
74+
predicate hasParameterBlockExcludingPipelines(ParamBlock block, int i) { none() }
7375

7476
predicate isFunctionParameter(Function f, int i) { none() }
7577

@@ -84,6 +86,8 @@ private class ParameterImpl extends TParameterImpl {
8486
}
8587

8688
abstract predicate isPipeline();
89+
90+
abstract predicate isPipelineByPropertyName();
8791
}
8892

8993
private class InternalParameter extends ParameterImpl, TInternalParameter {
@@ -101,8 +105,8 @@ private class InternalParameter extends ParameterImpl, TInternalParameter {
101105
hasParameterBlockImpl(p, block, i)
102106
}
103107

104-
override predicate hasParameterBlockExcludingPipeline(ParamBlock block, int i) {
105-
hasParameterBlockExcludingPipelineImpl(p, block, i)
108+
override predicate hasParameterBlockExcludingPipelines(ParamBlock block, int i) {
109+
hasParameterBlockExcludingPipelinesImpl(p, block, i)
106110
}
107111

108112
override predicate isFunctionParameter(Function f, int i) { isFunctionParameterImpl(p, f, i) }
@@ -114,6 +118,10 @@ private class InternalParameter extends ParameterImpl, TInternalParameter {
114118
override predicate isPipeline() {
115119
this.getAnAttribute().getANamedArgument() instanceof ValueFromPipelineAttribute
116120
}
121+
122+
override predicate isPipelineByPropertyName() {
123+
this.getAnAttribute().getANamedArgument() instanceof ValueFromPipelineByPropertyName
124+
}
117125
}
118126

119127
/**
@@ -147,6 +155,8 @@ private class Underscore extends ParameterImpl, TUnderscore {
147155

148156
final override predicate isPipeline() { any() }
149157

158+
final override predicate isPipelineByPropertyName() { none() }
159+
150160
final override predicate isFunctionParameter(Function f, int i) { f.getBody() = scope and i = -1 }
151161
}
152162

@@ -164,6 +174,8 @@ private class ThisParameter extends ParameterImpl, TThisParameter {
164174
final override Attribute getAnAttribute() { none() }
165175

166176
final override predicate isPipeline() { none() }
177+
178+
final override predicate isPipelineByPropertyName() { none() }
167179
}
168180

169181
private newtype TVariable =
@@ -241,8 +253,8 @@ class Parameter extends AbstractLocalScopeVariable, TParameter {
241253

242254
predicate hasParameterBlock(ParamBlock block, int i) { p.hasParameterBlock(block, i) }
243255

244-
predicate hasParameterBlockExcludingPipeline(ParamBlock block, int i) {
245-
p.hasParameterBlockExcludingPipeline(block, i)
256+
predicate hasParameterBlockExcludingPipelines(ParamBlock block, int i) {
257+
p.hasParameterBlockExcludingPipelines(block, i)
246258
}
247259

248260
predicate isFunctionParameter(Function f, int i) { p.isFunctionParameter(f, i) }
@@ -261,14 +273,14 @@ class Parameter extends AbstractLocalScopeVariable, TParameter {
261273
*/
262274
int getIndex() { result = this.getFunctionIndex() or result = this.getBlockIndex() }
263275

264-
int getIndexExcludingPipeline() {
265-
result = this.getFunctionIndex() or result = this.getBlockIndexExcludingPipeline()
276+
int getIndexExcludingPipelines() {
277+
result = this.getFunctionIndex() or result = this.getBlockIndexExcludingPipelines()
266278
}
267279

268280
/** Gets the index of this parameter in the parameter block, if any. */
269281
int getBlockIndex() { this.hasParameterBlock(_, result) }
270282

271-
int getBlockIndexExcludingPipeline() { this.hasParameterBlockExcludingPipeline(_, result) }
283+
int getBlockIndexExcludingPipelines() { this.hasParameterBlockExcludingPipelines(_, result) }
272284

273285
/** Gets the index of this parameter in the function, if any. */
274286
int getFunctionIndex() { this.isFunctionParameter(_, result) }
@@ -278,6 +290,8 @@ class Parameter extends AbstractLocalScopeVariable, TParameter {
278290
Attribute getAnAttribute() { result = p.getAnAttribute() }
279291

280292
predicate isPipeline() { p.isPipeline() }
293+
294+
predicate isPipelineByPropertyName() { p.isPipelineByPropertyName() }
281295
}
282296

283297
class PipelineParameter extends Parameter {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ private module ParameterNodes {
471471
// keywords in S are specified.
472472
exists(int i, int j, string name, NamedSet ns, Function f |
473473
pos.isPositional(j, ns) and
474-
parameter.getIndexExcludingPipeline() = i and
474+
parameter.getIndexExcludingPipelines() = i and
475475
f = parameter.getFunction() and
476476
f = ns.getAFunction() and
477477
name = parameter.getName() and
@@ -480,7 +480,7 @@ private module ParameterNodes {
480480
i -
481481
count(int k, Parameter p |
482482
k < i and
483-
p = f.getParameterExcludingPipline(k) and
483+
p = f.getParameterExcludingPiplines(k) and
484484
p.getName() = ns.getAName()
485485
)
486486
)

0 commit comments

Comments
 (0)