Skip to content

Commit f482c9d

Browse files
committed
PS: Make the implementation of 'getExtraNodeFromType' more complete. This is still not good enough, but it's enough to get the flow we need for now.
1 parent 03f3561 commit f482c9d

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

powershell/ql/lib/semmle/code/powershell/ast/internal/TypeExpression.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ class TypeNameExpr extends Expr, TTypeNameExpr {
2525
override string toString() { result = this.getName() }
2626

2727
predicate isQualified() { this.getNamespace() != "" }
28+
29+
predicate hasQualifiedName(string namespace, string typename) {
30+
this.isQualified() and
31+
this.parseName(namespace, typename)
32+
}
2833
}
2934

3035
class QualifiedTypeNameExpr extends TypeNameExpr {

powershell/ql/lib/semmle/code/powershell/controlflow/CfgNodes.qll

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,14 +685,24 @@ module ExprNodes {
685685
string getPossiblyQualifiedName() { result = e.getPossiblyQualifiedName() }
686686

687687
predicate isQualified() { e.isQualified() }
688+
689+
predicate hasQualifiedName(string namespace, string typename) {
690+
e.hasQualifiedName(namespace, typename)
691+
}
692+
}
693+
694+
private class QualifiedTypeNameExprChildMapping extends TypeNameExprChildMapping,
695+
QualifiedTypeNameExpr
696+
{
697+
override predicate relevantChild(Ast child) { super.relevantChild(child) }
688698
}
689699

690700
class QualifiedTypeNameExprCfgNode extends TypeNameExprCfgNode {
691-
QualifiedTypeNameExprCfgNode() { e.isQualified() }
701+
override QualifiedTypeNameExprChildMapping e;
692702

693-
override string getAPrimaryQlClass() { result = "QualifiedTypeNameExprCfgNode" }
703+
override TypeNameExpr getExpr() { result = e }
694704

695-
override QualifiedTypeNameExpr getExpr() { result = e }
705+
override string getAPrimaryQlClass() { result = "QualifiedTypeNameExprCfgNode" }
696706
}
697707

698708
private class ErrorExprChildMapping extends ExprChildMapping, ErrorExpr {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,10 @@ class TypeNameNode extends ExprNode {
544544

545545
predicate isQualified() { n.isQualified() }
546546

547+
predicate hasQualifiedName(string namespace, string typename) {
548+
n.hasQualifiedName(namespace, typename)
549+
}
550+
547551
string getNamespace() { result = n.getNamespace() }
548552

549553
string getPossiblyQualifiedName() { result = n.getPossiblyQualifiedName() }

powershell/ql/lib/semmle/code/powershell/frameworks/data/internal/ApiGraphModelsSpecific.qll

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,23 @@ API::Node getExtraNodeFromPath(string type, AccessPath path, int n) {
6969
}
7070

7171
/** Gets a Powershell-specific interpretation of the given `type`. */
72-
API::Node getExtraNodeFromType(string type) {
73-
exists(string consts, string suffix | parseRelevantType(type, consts, suffix) |
74-
none() // TODO
72+
API::Node getExtraNodeFromType(string rawType) {
73+
exists(
74+
string type, string suffix, DataFlow::QualifiedTypeNameNode qualifiedTypeName, string namespace,
75+
string typename
76+
|
77+
parseRelevantType(rawType, type, suffix) and
78+
qualifiedTypeName.hasQualifiedName(namespace, typename) and
79+
namespace + "." + typename = type
80+
|
81+
suffix = "!" and
82+
result = qualifiedTypeName.(DataFlow::LocalSourceNode).track()
83+
or
84+
suffix = "" and
85+
result = qualifiedTypeName.(DataFlow::LocalSourceNode).track().getInstance()
7586
)
7687
or
77-
type = "" and
88+
rawType = "" and
7889
result = API::root()
7990
}
8091

0 commit comments

Comments
 (0)