mirror of
https://github.com/github/codeql.git
synced 2026-04-29 18:55:14 +02:00
Merge pull request #466 from xiemaisi/js/more-data-flow-predicates
Approved by asger-semmle
This commit is contained in:
@@ -22,10 +22,9 @@ private predicate isBoundInMethod(MethodDeclaration method) {
|
||||
or
|
||||
exists (string name |
|
||||
name = method.getName() |
|
||||
exists (DataFlow::Node rhs, DataFlow::MethodCallNode bind |
|
||||
exists (DataFlow::MethodCallNode bind |
|
||||
// this.<methodName> = <expr>.bind(...)
|
||||
thiz.hasPropertyWrite(name, rhs) and
|
||||
bind.flowsTo(rhs) and
|
||||
bind = thiz.getAPropertySource(name) and
|
||||
bind.getMethodName() = "bind"
|
||||
)
|
||||
or
|
||||
|
||||
@@ -83,6 +83,11 @@ class AMDModuleDefinition extends CallExpr {
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets a source node whose value becomes the definition of this module. */
|
||||
DataFlow::SourceNode getAModuleSource() {
|
||||
result.flowsToExpr(getModuleExpr())
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `p` is the parameter corresponding to dependency `dep`.
|
||||
*/
|
||||
|
||||
@@ -178,6 +178,13 @@ abstract class SourceNode extends DataFlow::Node {
|
||||
DataFlow::NewNode getAnInstantiation() {
|
||||
result = getAnInvocation()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a source node whose value is stored in property `prop` of this node.
|
||||
*/
|
||||
DataFlow::SourceNode getAPropertySource(string prop) {
|
||||
result.flowsTo(getAPropertyWrite(prop).getRhs())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -439,9 +439,9 @@ class GeneralDirective extends CustomDirective, MkCustomDirective {
|
||||
result = getMember("link")
|
||||
or
|
||||
// { link: { pre: function preLink() { ... }, post: function postLink() { ... } } }
|
||||
exists (DataFlow::PropWrite pwn | kind = "pre" or kind = "post" |
|
||||
pwn = getMember("link").getAPropertyWrite(kind) and
|
||||
result.flowsTo(pwn.getRhs())
|
||||
(
|
||||
(kind = "pre" or kind = "post") and
|
||||
result = getMember("link").getAPropertySource(kind)
|
||||
)
|
||||
or
|
||||
// { compile: function() { ... return link; } }
|
||||
@@ -453,9 +453,9 @@ class GeneralDirective extends CustomDirective, MkCustomDirective {
|
||||
result = compileReturnSrc
|
||||
or
|
||||
// link = { pre: function preLink() { ... }, post: function postLink() { ... } }
|
||||
exists (DataFlow::PropWrite pwn | kind = "pre" or kind = "post" |
|
||||
pwn = compileReturnSrc.getAPropertyWrite(kind) and
|
||||
result.flowsTo(pwn.getRhs())
|
||||
(
|
||||
(kind = "pre" or kind = "post") and
|
||||
result = compileReturnSrc.getAPropertySource(kind)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -718,11 +718,10 @@ class ProviderRecipeDefinition extends RecipeDefinition {
|
||||
method set to your factory function is automatically created
|
||||
under the hood. */
|
||||
|
||||
exists(DataFlow::ThisNode thiz, DataFlow::Node rhs, InjectableFunction f |
|
||||
exists(DataFlow::ThisNode thiz, InjectableFunction f |
|
||||
f = getAFactoryFunction() and
|
||||
thiz.getBinder().getFunction() = f.asFunction() and
|
||||
thiz.hasPropertyWrite("$get", rhs) and
|
||||
result.flowsTo(rhs)
|
||||
result = thiz.getAPropertySource("$get")
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user