From a8c9776bacbf492065a6f2973920ad20c7818e32 Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Wed, 14 Sep 2022 16:42:27 +0200 Subject: [PATCH 1/5] Stop DoSing users with renderer errors --- src/renderer/base/renderer.cpp | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/renderer/base/renderer.cpp b/src/renderer/base/renderer.cpp index f686f4cc0a3..3ddcbf5648d 100644 --- a/src/renderer/base/renderer.cpp +++ b/src/renderer/base/renderer.cpp @@ -75,29 +75,25 @@ Renderer::~Renderer() } const auto hr = _PaintFrameForEngine(pEngine); - if (E_PENDING == hr) + LOG_HR_IF(hr, FAILED(hr) && hr != E_PENDING); + + if (--tries == 0) { - if (--tries == 0) + // Stop trying. + _pThread->DisablePainting(); + if (_pfnRendererEnteredErrorState) { - // Stop trying. - _pThread->DisablePainting(); - if (_pfnRendererEnteredErrorState) - { - _pfnRendererEnteredErrorState(); - } - // If there's no callback, we still don't want to FAIL_FAST: the renderer going black - // isn't near as bad as the entire application aborting. We're a component. We shouldn't - // abort applications that host us. - return S_FALSE; + _pfnRendererEnteredErrorState(); } - - // Add a bit of backoff. - // Sleep 150ms, 300ms, 450ms before failing out and disabling the renderer. - Sleep(renderBackoffBaseTimeMilliseconds * (maxRetriesForRenderEngine - tries)); - continue; + // If there's no callback, we still don't want to FAIL_FAST: the renderer going black + // isn't near as bad as the entire application aborting. We're a component. We shouldn't + // abort applications that host us. + return S_FALSE; } - LOG_IF_FAILED(hr); - break; + + // Add a bit of backoff. + // Sleep 150ms, 300ms, 450ms before failing out and disabling the renderer. + Sleep(renderBackoffBaseTimeMilliseconds * (maxRetriesForRenderEngine - tries)); } } From a6cf48c050827af1040481ed65bdca092ed0b2f6 Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Thu, 15 Sep 2022 17:12:07 +0200 Subject: [PATCH 2/5] Fix test failures --- src/host/ut_host/ConptyOutputTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/host/ut_host/ConptyOutputTests.cpp b/src/host/ut_host/ConptyOutputTests.cpp index 1ebff63cac2..7bdaeb0c201 100644 --- a/src/host/ut_host/ConptyOutputTests.cpp +++ b/src/host/ut_host/ConptyOutputTests.cpp @@ -72,7 +72,7 @@ class ConptyOutputTests gci.SetFillAttribute(0x07); // DARK_WHITE on DARK_BLACK gci.CalculateDefaultColorIndices(); - g.pRender = new Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, nullptr); + g.pRender = new Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, std::make_unique()); m_state->PrepareNewTextBufferInfo(true, TerminalViewWidth, TerminalViewHeight); auto& currentBuffer = gci.GetActiveOutputBuffer(); From f14ae3313e3e5661af8c72560b60e9c3cbafb34f Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Thu, 15 Sep 2022 22:48:34 +0200 Subject: [PATCH 3/5] Fix test failures --- src/inc/test/CommonState.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inc/test/CommonState.hpp b/src/inc/test/CommonState.hpp index 40e584b543d..205dec146f0 100644 --- a/src/inc/test/CommonState.hpp +++ b/src/inc/test/CommonState.hpp @@ -81,7 +81,7 @@ class CommonState { Globals& g = Microsoft::Console::Interactivity::ServiceLocator::LocateGlobals(); CONSOLE_INFORMATION& gci = g.getConsoleInformation(); - g.pRender = new Microsoft::Console::Render::Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, nullptr); + g.pRender = new Microsoft::Console::Render::Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, std::make_unique()); } void CleanupGlobalRenderer() From 7b7cf1aa77de014a10382eed4cadbd7df359ee7a Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Fri, 16 Sep 2022 02:53:40 +0200 Subject: [PATCH 4/5] Fix namespace issue --- src/inc/test/CommonState.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inc/test/CommonState.hpp b/src/inc/test/CommonState.hpp index 205dec146f0..cf677683e12 100644 --- a/src/inc/test/CommonState.hpp +++ b/src/inc/test/CommonState.hpp @@ -81,7 +81,7 @@ class CommonState { Globals& g = Microsoft::Console::Interactivity::ServiceLocator::LocateGlobals(); CONSOLE_INFORMATION& gci = g.getConsoleInformation(); - g.pRender = new Microsoft::Console::Render::Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, std::make_unique()); + g.pRender = new Microsoft::Console::Render::Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, std::make_unique()); } void CleanupGlobalRenderer() From 899c23a3c73e9435f2ef83a505824ae06abddc31 Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Fri, 16 Sep 2022 15:41:22 +0200 Subject: [PATCH 5/5] Whoops --- src/host/ut_host/ConptyOutputTests.cpp | 2 +- src/inc/test/CommonState.hpp | 2 +- src/renderer/base/renderer.cpp | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/host/ut_host/ConptyOutputTests.cpp b/src/host/ut_host/ConptyOutputTests.cpp index 7bdaeb0c201..1ebff63cac2 100644 --- a/src/host/ut_host/ConptyOutputTests.cpp +++ b/src/host/ut_host/ConptyOutputTests.cpp @@ -72,7 +72,7 @@ class ConptyOutputTests gci.SetFillAttribute(0x07); // DARK_WHITE on DARK_BLACK gci.CalculateDefaultColorIndices(); - g.pRender = new Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, std::make_unique()); + g.pRender = new Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, nullptr); m_state->PrepareNewTextBufferInfo(true, TerminalViewWidth, TerminalViewHeight); auto& currentBuffer = gci.GetActiveOutputBuffer(); diff --git a/src/inc/test/CommonState.hpp b/src/inc/test/CommonState.hpp index cf677683e12..40e584b543d 100644 --- a/src/inc/test/CommonState.hpp +++ b/src/inc/test/CommonState.hpp @@ -81,7 +81,7 @@ class CommonState { Globals& g = Microsoft::Console::Interactivity::ServiceLocator::LocateGlobals(); CONSOLE_INFORMATION& gci = g.getConsoleInformation(); - g.pRender = new Microsoft::Console::Render::Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, std::make_unique()); + g.pRender = new Microsoft::Console::Render::Renderer(gci.GetRenderSettings(), &gci.renderData, nullptr, 0, nullptr); } void CleanupGlobalRenderer() diff --git a/src/renderer/base/renderer.cpp b/src/renderer/base/renderer.cpp index 3ddcbf5648d..9ea4e9040bc 100644 --- a/src/renderer/base/renderer.cpp +++ b/src/renderer/base/renderer.cpp @@ -75,7 +75,12 @@ Renderer::~Renderer() } const auto hr = _PaintFrameForEngine(pEngine); - LOG_HR_IF(hr, FAILED(hr) && hr != E_PENDING); + if (SUCCEEDED(hr)) + { + break; + } + + LOG_HR_IF(hr, hr != E_PENDING); if (--tries == 0) {