From 34827991835a1d14b9e225495d4db4577930d99d Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Sun, 8 Oct 2017 14:00:04 -0700 Subject: [PATCH] Add additional `requestContext` and `requestContext.RouteData` null checks - #6 --- src/System.Web.Mvc/DefaultControllerFactory.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/System.Web.Mvc/DefaultControllerFactory.cs b/src/System.Web.Mvc/DefaultControllerFactory.cs index a92a90cd2..c277c071b 100644 --- a/src/System.Web.Mvc/DefaultControllerFactory.cs +++ b/src/System.Web.Mvc/DefaultControllerFactory.cs @@ -141,7 +141,8 @@ public virtual IController CreateController(RequestContext requestContext, strin throw new ArgumentNullException("requestContext"); } - if (String.IsNullOrEmpty(controllerName) && !requestContext.RouteData.HasDirectRouteMatch()) + if (String.IsNullOrEmpty(controllerName) && + (requestContext.RouteData == null || !requestContext.RouteData.HasDirectRouteMatch())) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controllerName"); } @@ -153,6 +154,10 @@ public virtual IController CreateController(RequestContext requestContext, strin protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) { + if (requestContext == null) + { + throw new ArgumentNullException("requestContext"); + } if (controllerType == null) { throw new HttpException(404, @@ -170,6 +175,7 @@ protected internal virtual IController GetControllerInstance(RequestContext requ controllerType), "controllerType"); } + return ControllerActivator.Create(requestContext, controllerType); } @@ -214,7 +220,7 @@ protected internal virtual Type GetControllerType(RequestContext requestContext, // first search in the current route's namespace collection object routeNamespacesObj; Type match; - if (routeData.DataTokens.TryGetValue(RouteDataTokenKeys.Namespaces, out routeNamespacesObj)) + if (routeData != null && routeData.DataTokens.TryGetValue(RouteDataTokenKeys.Namespaces, out routeNamespacesObj)) { IEnumerable routeNamespaces = routeNamespacesObj as IEnumerable; if (routeNamespaces != null && routeNamespaces.Any()) @@ -232,10 +238,11 @@ protected internal virtual Type GetControllerType(RequestContext requestContext, } // then search in the application's default namespace collection + RouteBase route = routeData == null ? null : routeData.Route; if (ControllerBuilder.DefaultNamespaces.Count > 0) { HashSet namespaceDefaults = new HashSet(ControllerBuilder.DefaultNamespaces, StringComparer.OrdinalIgnoreCase); - match = GetControllerTypeWithinNamespaces(routeData.Route, controllerName, namespaceDefaults); + match = GetControllerTypeWithinNamespaces(route, controllerName, namespaceDefaults); if (match != null) { return match; @@ -243,7 +250,7 @@ protected internal virtual Type GetControllerType(RequestContext requestContext, } // if all else fails, search every namespace - return GetControllerTypeWithinNamespaces(routeData.Route, controllerName, null /* namespaces */); + return GetControllerTypeWithinNamespaces(route, controllerName, null /* namespaces */); } private static Type GetControllerTypeFromDirectRoute(RouteData routeData)