From 059f07f9f33460c809a93e0fda1165f5c6f6d805 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Wed, 15 Apr 2020 18:34:58 +0200 Subject: fixes for code creating reversed Rectangles ie. where left > right or top > bottom These are all places where the code is self-evidently doing the wrong thing. Found by adding asserts to tools::Rectangle. In theory, this is legit, and code that wants a proper Rectangle is supposed to be first call Justify on a Rectangle, but lots of places don't do that, and that seems very dodgy to me. So lets work towards Rectangles always being in a valid state. Change-Id: I03296a624bd9b5b193e6aa8778addfb09708cdc7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92310 Tested-by: Jenkins Reviewed-by: Noel Grandin --- emfio/source/reader/emfreader.cxx | 6 ++++++ emfio/source/reader/wmfreader.cxx | 6 ++++++ filter/source/graphicfilter/ipict/ipict.cxx | 7 +++++++ sc/source/ui/view/tabview3.cxx | 4 ++-- sd/source/ui/view/viewshel.cxx | 2 ++ sfx2/source/sidebar/Deck.cxx | 2 ++ svtools/source/control/ruler.cxx | 4 ++-- sw/source/uibase/uiview/view.cxx | 2 +- vcl/source/control/scrbar.cxx | 7 +++++-- 9 files changed, 33 insertions(+), 7 deletions(-) diff --git a/emfio/source/reader/emfreader.cxx b/emfio/source/reader/emfreader.cxx index 35a5f020d0fa..252015bab2e6 100644 --- a/emfio/source/reader/emfreader.cxx +++ b/emfio/source/reader/emfreader.cxx @@ -2088,6 +2088,12 @@ namespace emfio mpInputStream->ReadInt32(nBottom); SAL_INFO("emfio", "\t\tLeft: " << nLeft << ", top: " << nTop << ", right: " << nRight << ", bottom: " << nBottom); + if (nLeft > nRight || nTop > nBottom) + { + SAL_WARN("emfio", "broken rectangle"); + mpInputStream->SetError( SVSTREAM_FILEFORMAT_ERROR ); + return tools::Rectangle(); + } return tools::Rectangle(nLeft, nTop, nRight, nBottom); } diff --git a/emfio/source/reader/wmfreader.cxx b/emfio/source/reader/wmfreader.cxx index 1d67f5c52e98..3f8af75bbd50 100644 --- a/emfio/source/reader/wmfreader.cxx +++ b/emfio/source/reader/wmfreader.cxx @@ -165,6 +165,12 @@ namespace emfio aTL = ReadYX(); aBR.AdjustX( -1 ); aBR.AdjustY( -1 ); + if (aTL.X() > aBR.X() || aTL.Y() > aBR.Y()) + { + SAL_WARN("vcl.wmf", "broken rectangle"); + mpInputStream->SetError( SVSTREAM_FILEFORMAT_ERROR ); + return tools::Rectangle(); + } return tools::Rectangle( aTL, aBR ); } diff --git a/filter/source/graphicfilter/ipict/ipict.cxx b/filter/source/graphicfilter/ipict/ipict.cxx index 58ec7423de8f..d494543fb1b4 100644 --- a/filter/source/graphicfilter/ipict/ipict.cxx +++ b/filter/source/graphicfilter/ipict/ipict.cxx @@ -454,6 +454,13 @@ void PictReader::ReadRectangle(tools::Rectangle & rRect) aTopLeft=ReadPoint(); aBottomRight=ReadPoint(); + if (aTopLeft.X() > aBottomRight.X() || aTopLeft.Y() > aBottomRight.Y()) + { + SAL_WARN("filter.pict", "broken rectangle"); + pPict->SetError( SVSTREAM_FILEFORMAT_ERROR ); + rRect = tools::Rectangle(); + return; + } rRect=tools::Rectangle(aTopLeft,aBottomRight); SAL_INFO("filter.pict", "ReadRectangle: " << rRect); diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index fa68182b2399..cfff46935dad 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -2674,7 +2674,7 @@ void ScTabView::PaintTopArea( SCCOL nStartCol, SCCOL nEndCol ) long nStartX = aViewData.GetScrPos( nStartCol, 0, eWhich ).X(); long nEndX; if (nEndCol >= pDoc->MaxCol()) - nEndX = bLayoutRTL ? 0 : ( aWinSize.Width()-1 ); + nEndX = nStartX + (bLayoutRTL ? 0 : ( aWinSize.Width()-1 )); else nEndX = aViewData.GetScrPos( nEndCol+1, 0, eWhich ).X() - nLayoutSign; pColBar[eWhich]->Invalidate( @@ -2727,7 +2727,7 @@ void ScTabView::PaintLeftArea( SCROW nStartRow, SCROW nEndRow ) long nStartY = aViewData.GetScrPos( 0, nStartRow, eWhich ).Y(); long nEndY; if (nEndRow >= pDoc->MaxRow()) - nEndY = aWinSize.Height()-1; + nEndY = nStartY + aWinSize.Height() - 1; else nEndY = aViewData.GetScrPos( 0, nEndRow+1, eWhich ).Y() - 1; pRowBar[eWhich]->Invalidate( diff --git a/sd/source/ui/view/viewshel.cxx b/sd/source/ui/view/viewshel.cxx index 9ef01355849c..97719c049e32 100644 --- a/sd/source/ui/view/viewshel.cxx +++ b/sd/source/ui/view/viewshel.cxx @@ -929,6 +929,8 @@ void ViewShell::ArrangeGUIElements() { if (mpImpl->mbArrangeActive) return; + if (maViewSize.IsEmpty()) + return; mpImpl->mbArrangeActive = true; // Calculate border for in-place editing. diff --git a/sfx2/source/sidebar/Deck.cxx b/sfx2/source/sidebar/Deck.cxx index 3bfb21134e3b..d874ba59b92d 100644 --- a/sfx2/source/sidebar/Deck.cxx +++ b/sfx2/source/sidebar/Deck.cxx @@ -110,6 +110,8 @@ tools::Rectangle Deck::GetContentArea() const { const Size aWindowSize (GetSizePixel()); const int nBorderSize (Theme::GetInteger(Theme::Int_DeckBorderSize)); + if (aWindowSize.IsEmpty()) + return tools::Rectangle(); return tools::Rectangle( Theme::GetInteger(Theme::Int_DeckLeftPadding) + nBorderSize, diff --git a/svtools/source/control/ruler.cxx b/svtools/source/control/ruler.cxx index a4f30d9c97a7..8608adc3b7fc 100644 --- a/svtools/source/control/ruler.cxx +++ b/svtools/source/control/ruler.cxx @@ -594,8 +594,8 @@ void Ruler::ImplDrawTicks(vcl::RenderContext& rRenderContext, long nMin, long nM if (nMin < nHorizontalLocation && nHorizontalLocation < nMax) { - ImplVDrawRect(rRenderContext, nHorizontalLocation, nBottom, nHorizontalLocation + DPIOffset, nBottom - 1 * nScale); - ImplVDrawRect(rRenderContext, nHorizontalLocation, nTop, nHorizontalLocation + DPIOffset, nTop + 1 * nScale); + ImplVDrawRect(rRenderContext, nHorizontalLocation, nBottom - 1 * nScale, nHorizontalLocation + DPIOffset, nBottom); + ImplVDrawRect(rRenderContext, nHorizontalLocation, nTop, nHorizontalLocation + DPIOffset, nTop + 1 * nScale); } nHorizontalLocation = nStart - n; diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx index 5f34e355bb17..f2d10b466dce 100644 --- a/sw/source/uibase/uiview/view.cxx +++ b/sw/source/uibase/uiview/view.cxx @@ -1290,7 +1290,7 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue > const SwViewOption* pVOpt = m_pWrtShell->GetViewOptions(); sal_Int64 nX = rRect.Left(), nY = rRect.Top(), nLeft = rVis.Left(), nTop = rVis.Top(); - sal_Int64 nRight = LONG_MIN; + sal_Int64 nRight = nLeft; sal_Int64 nBottom = LONG_MIN; sal_Int16 nZoomType = static_cast< sal_Int16 >(pVOpt->GetZoomType()); sal_Int16 nZoomFactor = static_cast < sal_Int16 > (pVOpt->GetZoom()); diff --git a/vcl/source/control/scrbar.cxx b/vcl/source/control/scrbar.cxx index e0a11cf877b6..976a5b452c97 100644 --- a/vcl/source/control/scrbar.cxx +++ b/vcl/source/control/scrbar.cxx @@ -269,7 +269,7 @@ void ScrollBar::ImplCalc( bool bUpdate ) aControlRegion, ControlState::NONE, ImplControlValue(), aBoundingRegion, aTrackRegion ) ) maTrackRect = aTrackRegion; else - maTrackRect = tools::Rectangle( maBtn1Rect.TopRight(), maBtn2Rect.BottomLeft() ); + maTrackRect = maBtn1Rect; // Check if available space is big enough for thumb ( min thumb size = ScrBar width/height ) mnThumbPixRange = maTrackRect.Right() - maTrackRect.Left(); @@ -306,7 +306,10 @@ void ScrollBar::ImplCalc( bool bUpdate ) aControlRegion, ControlState::NONE, ImplControlValue(), aBoundingRegion, aTrackRegion ) ) maTrackRect = aTrackRegion; else - maTrackRect = tools::Rectangle( maBtn1Rect.BottomLeft()+Point(0,1), maBtn2Rect.TopRight() ); + { + maTrackRect = maBtn1Rect; + maTrackRect.AdjustTop(1); + } // Check if available space is big enough for thumb mnThumbPixRange = maTrackRect.Bottom() - maTrackRect.Top(); -- cgit