Redirect (of a Faces view) during an action is caught by the bridge and turned into a simple navigation – I.e. we view such a redirect as meaning change the view of the this portlet NOT change the view of the browser from the consumer page. Its impelmented by tacking a request attribute on in the redirect method and then detecting this attr in the lifecycle manager/controller (doFacesRequest). If a redirect is detected we return normally but don't preserve state. However the code doesn't remove the redirect request attribute. If the portlet container turns around and calls render in the same request scope the attr still exists. And as we upgraded the render impl to also detect/support such redirects, the carrying forward of this attribute causes the render to also think it now needs to do one of these navigational redirects – and the by product of executing this causes us to rerun the render with the same request attributes as the render started with – but oops this already contained the redirect attr carried forward from the action – so we get into an infinite loop.
Solution is simple: merely remove the request attr before returning from the action.