Skip to content

Commit 5de6da4

Browse files
authored
Merge pull request #1697 from esben-semmle/js/fix-missing-this-in-method
Approved by xiemaisi
2 parents 2df0509 + bc2785d commit 5de6da4

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

javascript/ql/src/semmle/javascript/frameworks/AngularJS/AngularJSCore.qll

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -711,50 +711,52 @@ private class AngularMethodCall extends AngularJSCall {
711711
}
712712

713713
/**
714-
* A call to a method on a builtin service.
714+
* A call to a builtin service or one of its methods.
715715
*/
716-
private class ServiceMethodCall extends AngularJSCall {
717-
MethodCallExpr mce;
716+
private class BuiltinServiceCall extends AngularJSCall {
717+
CallExpr call;
718718

719-
ServiceMethodCall() {
719+
BuiltinServiceCall() {
720720
exists(BuiltinServiceReference service |
721-
service.getAMethodCall(_) = this and
722-
mce = this
721+
service.getAMethodCall(_) = this or
722+
service.getACall() = this
723+
|
724+
call = this
723725
)
724726
}
725727

726728
override predicate interpretsArgumentAsHtml(Expr e) {
727729
exists(ServiceReference service, string methodName |
728730
service.getName() = "$sce" and
729-
mce = service.getAMethodCall(methodName)
731+
call = service.getAMethodCall(methodName)
730732
|
731733
// specialized call
732734
(methodName = "trustAsHtml" or methodName = "trustAsCss") and
733-
e = mce.getArgument(0)
735+
e = call.getArgument(0)
734736
or
735737
// generic call with enum argument
736738
methodName = "trustAs" and
737739
exists(DataFlow::PropRead prn |
738-
prn.asExpr() = mce.getArgument(0) and
740+
prn.asExpr() = call.getArgument(0) and
739741
(prn = service.getAPropertyAccess("HTML") or prn = service.getAPropertyAccess("CSS")) and
740-
e = mce.getArgument(1)
742+
e = call.getArgument(1)
741743
)
742744
)
743745
}
744746

745747
override predicate storesArgumentGlobally(Expr e) {
746748
exists(ServiceReference service, string serviceName, string methodName |
747749
service.getName() = serviceName and
748-
mce = service.getAMethodCall(methodName)
750+
call = service.getAMethodCall(methodName)
749751
|
750752
// AngularJS caches (only available during runtime, so similar to sessionStorage)
751753
(serviceName = "$cacheFactory" or serviceName = "$templateCache") and
752754
methodName = "put" and
753-
e = mce.getArgument(1)
755+
e = call.getArgument(1)
754756
or
755757
serviceName = "$cookies" and
756758
(methodName = "put" or methodName = "putObject") and
757-
e = mce.getArgument(1)
759+
e = call.getArgument(1)
758760
)
759761
}
760762

@@ -768,23 +770,25 @@ private class ServiceMethodCall extends AngularJSCall {
768770
methodName = "$watchCollection" or
769771
methodName = "$watchGroup"
770772
|
771-
e = scope.getAMethodCall(methodName).getArgument(0)
773+
call = scope.getAMethodCall(methodName) and
774+
e = call.getArgument(0)
772775
)
773776
or
774777
exists(ServiceReference service |
775778
service.getName() = "$compile" or
776779
service.getName() = "$parse" or
777780
service.getName() = "$interpolate"
778781
|
779-
e = service.getACall().getArgument(0)
782+
call = service.getACall() and
783+
e = call.getArgument(0)
780784
)
781785
or
782-
exists(ServiceReference service, CallExpr filter, CallExpr filterInvocation |
786+
exists(ServiceReference service, CallExpr filterInvocation |
783787
// `$filter('orderBy')(collection, expression)`
784788
service.getName() = "$filter" and
785-
filter = service.getACall() and
786-
filter.getArgument(0).mayHaveStringValue("orderBy") and
787-
filterInvocation.getCallee() = filter and
789+
call = service.getACall() and
790+
call.getArgument(0).mayHaveStringValue("orderBy") and
791+
filterInvocation.getCallee() = call and
788792
e = filterInvocation.getArgument(1)
789793
)
790794
}

0 commit comments

Comments
 (0)