@@ -83,8 +83,8 @@ class ActionControllerClass extends DataFlow::ClassNode {
8383 }
8484}
8585
86- private DataFlow :: LocalSourceNode actionControllerInstance ( ) {
87- result = any ( ActionControllerClass cls ) .getSelf ( )
86+ private API :: Node actionControllerInstance ( ) {
87+ result = any ( ActionControllerClass cls ) .getSelf ( ) . track ( )
8888}
8989
9090/**
@@ -222,19 +222,19 @@ private class ActionControllerRenderToCall extends RenderToCallImpl {
222222 }
223223}
224224
225+ pragma [ nomagic]
226+ private DataFlow:: CallNode renderCall ( ) {
227+ // ActionController#render is an alias for ActionController::Renderer#render
228+ result =
229+ [
230+ any ( ActionControllerClass c ) .trackModule ( ) .getAMethodCall ( "render" ) ,
231+ any ( ActionControllerClass c ) .trackModule ( ) .getReturn ( "renderer" ) .getAMethodCall ( "render" )
232+ ]
233+ }
234+
225235/** A call to `ActionController::Renderer#render`. */
226236private class RendererRenderCall extends RenderCallImpl {
227- RendererRenderCall ( ) {
228- this =
229- [
230- // ActionController#render is an alias for ActionController::Renderer#render
231- any ( ActionControllerClass c ) .getAnImmediateReference ( ) .getAMethodCall ( "render" ) ,
232- any ( ActionControllerClass c )
233- .getAnImmediateReference ( )
234- .getAMethodCall ( "renderer" )
235- .getAMethodCall ( "render" )
236- ] .asExpr ( ) .getExpr ( )
237- }
237+ RendererRenderCall ( ) { this = renderCall ( ) .asExpr ( ) .getExpr ( ) }
238238}
239239
240240/** A call to `html_escape` from within a controller. */
@@ -260,6 +260,7 @@ class RedirectToCall extends MethodCall {
260260 this =
261261 controller
262262 .getSelf ( )
263+ .track ( )
263264 .getAMethodCall ( [ "redirect_to" , "redirect_back" , "redirect_back_or_to" ] )
264265 .asExpr ( )
265266 .getExpr ( )
@@ -600,9 +601,7 @@ private module ParamsSummaries {
600601 * response.
601602 */
602603private module Response {
603- DataFlow:: LocalSourceNode response ( ) {
604- result = actionControllerInstance ( ) .getAMethodCall ( "response" )
605- }
604+ API:: Node response ( ) { result = actionControllerInstance ( ) .getReturn ( "response" ) }
606605
607606 class BodyWrite extends DataFlow:: CallNode , Http:: Server:: HttpResponse:: Range {
608607 BodyWrite ( ) { this = response ( ) .getAMethodCall ( "body=" ) }
@@ -628,7 +627,7 @@ private module Response {
628627 HeaderWrite ( ) {
629628 // response.header[key] = val
630629 // response.headers[key] = val
631- this = response ( ) .getAMethodCall ( [ "header" , "headers" ] ) .getAMethodCall ( "[]=" )
630+ this = response ( ) .getReturn ( [ "header" , "headers" ] ) .getAMethodCall ( "[]=" )
632631 or
633632 // response.set_header(key) = val
634633 // response[header] = val
@@ -673,18 +672,12 @@ private module Response {
673672 }
674673}
675674
676- private class ActionControllerLoggerInstance extends DataFlow:: Node {
677- ActionControllerLoggerInstance ( ) {
678- this = actionControllerInstance ( ) .getAMethodCall ( "logger" )
679- or
680- any ( ActionControllerLoggerInstance i ) .( DataFlow:: LocalSourceNode ) .flowsTo ( this )
681- }
682- }
683-
684675private class ActionControllerLoggingCall extends DataFlow:: CallNode , Logging:: Range {
685676 ActionControllerLoggingCall ( ) {
686- this .getReceiver ( ) instanceof ActionControllerLoggerInstance and
687- this .getMethodName ( ) = [ "debug" , "error" , "fatal" , "info" , "unknown" , "warn" ]
677+ this =
678+ actionControllerInstance ( )
679+ .getReturn ( "logger" )
680+ .getAMethodCall ( [ "debug" , "error" , "fatal" , "info" , "unknown" , "warn" ] )
688681 }
689682
690683 // Note: this is identical to the definition `stdlib.Logger.LoggerInfoStyleCall`.
0 commit comments