From c3826bb2fcb60efa495b54dd66296bc55ce28ecf Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Thu, 1 Nov 2018 16:10:19 +0100 Subject: [PATCH] Make sure we always have a valid screen layout Add more checks and fix some callers to make sure that the server core always has a valid screen layout configured. --- common/rfb/VNCServerST.cxx | 15 +++++++++------ unix/x0vncserver/XDesktop.cxx | 5 +++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index 8cc04f74..a9ae62eb 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -305,8 +305,6 @@ void VNCServerST::setPixelBuffer(PixelBuffer* pb_, const ScreenSet& layout) delete comparer; comparer = 0; - screenLayout = layout; - if (!pb) { screenLayout = ScreenSet(); @@ -316,16 +314,17 @@ void VNCServerST::setPixelBuffer(PixelBuffer* pb_, const ScreenSet& layout) return; } + if (!layout.validate(pb->width(), pb->height())) + throw Exception("setPixelBuffer: invalid screen layout"); + + screenLayout = layout; + // Assume the framebuffer contents wasn't saved and reset everything // that tracks its contents comparer = new ComparingUpdateTracker(pb); renderedCursorInvalid = true; add_changed(pb->getRect()); - // Make sure that we have at least one screen - if (screenLayout.num_screens() == 0) - screenLayout.add_screen(Screen(0, 0, 0, pb->width(), pb->height(), 0)); - std::list::iterator ci, ci_next; for (ci=clients.begin();ci!=clients.end();ci=ci_next) { ci_next = ci; ci_next++; @@ -359,6 +358,10 @@ void VNCServerST::setPixelBuffer(PixelBuffer* pb_) } } + // Make sure that we have at least one screen + if (layout.num_screens() == 0) + layout.add_screen(Screen(0, 0, 0, pb->width(), pb->height(), 0)); + setPixelBuffer(pb_, layout); } diff --git a/unix/x0vncserver/XDesktop.cxx b/unix/x0vncserver/XDesktop.cxx index f8b579d7..e77e7656 100644 --- a/unix/x0vncserver/XDesktop.cxx +++ b/unix/x0vncserver/XDesktop.cxx @@ -397,6 +397,11 @@ ScreenSet XDesktop::computeScreenLayout() } #endif + // Make sure that we have at least one screen + if (layout.num_screens() == 0) + layout.add_screen(rfb::Screen(0, 0, 0, geometry->width(), + geometry->height(), 0)); + return layout; } -- 2.39.5