Skip to content

Commit f1c663b

Browse files
committed
JS: Add steps from instantiation site to placeholder expr
1 parent 5659a8a commit f1c663b

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

javascript/ql/src/semmle/javascript/frameworks/Templating.qll

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,31 @@ module Templating {
161161
}
162162
}
163163

164+
/** Gets an API node that may flow to `succ` through a template instantiation. */
165+
private API::Node getTemplateInput(DataFlow::SourceNode succ) {
166+
exists(TemplateInstantiaton inst, API::Node base, string name |
167+
base.getARhs() = inst.getTemplateParamsNode() and
168+
result = base.getMember(name) and
169+
succ = inst.getTemplateFile().getAPlaceholder().getInnerTopLevel().getAVariableUse(name)
170+
)
171+
or
172+
exists(string prop, DataFlow::SourceNode prev |
173+
result = getTemplateInput(prev).getMember(prop) and
174+
succ = prev.getAPropertyRead(prop)
175+
)
176+
}
177+
178+
private class TemplateInputStep extends DataFlow::SharedFlowStep {
179+
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
180+
getTemplateInput(succ).getARhs() = pred
181+
}
182+
}
183+
164184
/** A file that can be referenced by a template instantiation. */
165-
abstract class TemplateFile extends File { }
185+
abstract class TemplateFile extends File {
186+
/** Gets a placeholder tag in this file. */
187+
final TemplatePlaceholderTag getAPlaceholder() { result.getFile() = this }
188+
}
166189

167190
/** Any HTML file, seen as a possible target for template instantiation. */
168191
private class TemplateFileByExtension extends TemplateFile {

0 commit comments

Comments
 (0)