vcl/source/treelist/svimpbox.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
New commits: commit 2d0ff08f8724c6fd2b7801c7eb8fa0a41a90f883 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Thu Dec 22 10:27:51 2022 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu Dec 22 17:07:08 2022 +0000 tdf#152532 vcl: Don't convert negative entry count to unsigned In particular for empty output sizes (as is the case for the observed cases from tdf#152532, where `SvImpLBox::AdjustScrollBars` gets called before the resize to the final size happens), (aOSize.Height() - m_nHorSBarHeight) / nEntryHeight can become negative, and that was silently converted into a large positive integer when assigned to `m_nVisibleCount` which is of type `sal_uLong`. As a result, `SvImpLBox::FillView` later moved the view to the very top of the scroll area and did not make sure that the selected entry would remain inside of the view. Prevent that by using 0 as minimum value. Also explicitly convert to unsigned using `o3tl::make_unsigned` at another place that should be fine (but will trigger an assert now if it isn't, rather than silently converting a negative value to unsigned). Change-Id: Iab1402603adb7b7c93927ecbfd10336049bfd71b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144744 Tested-by: Jenkins Reviewed-by: Rafael Lima <rafael.palma.l...@gmail.com> Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/vcl/source/treelist/svimpbox.cxx b/vcl/source/treelist/svimpbox.cxx index b5efa69aa19d..af9d2b1e1437 100644 --- a/vcl/source/treelist/svimpbox.cxx +++ b/vcl/source/treelist/svimpbox.cxx @@ -1132,7 +1132,7 @@ void SvImpLBox::AdjustScrollBars( Size& rSize ) sal_uLong nTotalCount = m_pView->GetVisibleCount(); // number of entries visible within the view - m_nVisibleCount = aOSize.Height() / nEntryHeight; + m_nVisibleCount = o3tl::make_unsigned(aOSize.Height() / nEntryHeight); // do we need a vertical scrollbar? if( bVerSBar || nTotalCount > m_nVisibleCount ) @@ -1153,7 +1153,7 @@ void SvImpLBox::AdjustScrollBars( Size& rSize ) nResult |= 0x0002; // the number of entries visible within the view has to be recalculated // because the horizontal scrollbar is now visible. - m_nVisibleCount = (aOSize.Height() - m_nHorSBarHeight) / nEntryHeight; + m_nVisibleCount = o3tl::make_unsigned(std::max<tools::Long>(0, aOSize.Height() - m_nHorSBarHeight) / nEntryHeight); // we might actually need a vertical scrollbar now if( !(nResult & 0x0001) && ((nTotalCount > m_nVisibleCount) || bVerSBar) )