diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2018-08-15 12:18:30 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2018-08-15 14:35:46 +0200 |
commit | 2c16b803b681b1fab4ec337273fdbae36f9c79fe (patch) | |
tree | 3975e18b59fb3e11389599ede8287a2c51f3f468 | |
parent | 95fe8fa97a62ae90b6d092c52d2fc6fae198e011 (diff) |
Avoid unsigned wrap-around when nVisibleViewCount is zero
...(and some more improvements to that code, like dropping the unnecessary
casting to sal_uInt16) as Clang's new -fsanitize=implicit-conversion flags
during CppunitTest_dbaccess_dialog_save:
> svtools/source/contnr/svimpbox.cxx:1317:26: runtime error: implicit conversion from type 'int' of value -1 (32-bit, signed) to type 'sal_uInt16' (aka 'unsigned short') changed the value to 65535 (16-bit, unsigned)
> #0 in SvImpLBox::FillView() at svtools/source/contnr/svimpbox.cxx:1317:26 (instdir/program/libsvtlo.so +0x15e6edb)
> #1 in SvImpLBox::UpdateAll(bool) at svtools/source/contnr/svimpbox.cxx:697:5 (instdir/program/libsvtlo.so +0x15e5151)
> #2 in SvImpLBox::Resize() at svtools/source/contnr/svimpbox.cxx:1299:9 (instdir/program/libsvtlo.so +0x1602c31)
> #3 in SvTreeListBox::Resize() at svtools/source/contnr/treelistbox.cxx:1427:12 (instdir/program/libsvtlo.so +0x17282ee)
> #4 in vcl::Window::ImplCallResize() at vcl/source/window/event.cxx:523:5 (instdir/program/libvcllo.so +0x3196951)
> #5 in vcl::Window::ImplPosSizeWindow(long, long, long, long, PosSizeFlags) at vcl/source/window/window.cxx:1603:17 (instdir/program/libvcllo.so +0x374c602)
> #6 in vcl::Window::setPosSizePixel(long, long, long, long, PosSizeFlags) at vcl/source/window/window.cxx:2828:18 (instdir/program/libvcllo.so +0x377e616)
> #7 in vcl::Window::SetPosSizePixel(Point const&, Size const&) at vcl/source/window/window2.cxx:1300:5 (instdir/program/libvcllo.so +0x36deba1)
> #8 in dbaui::OAppDetailPageHelper::Resize() at dbaccess/source/ui/app/AppDetailPageHelper.cxx:928:18 (instdir/program/libdbulo.so +0x1733a91)
> #9 in dbaui::OAppDetailPageHelper::switchPreview(dbaui::PreviewMode, bool) at dbaccess/source/ui/app/AppDetailPageHelper.cxx:988:9 (instdir/program/libdbulo.so +0x172ce0e)
> #10 in dbaui::OAppDetailPageHelper::setDetailPage(vcl::Window*) at dbaccess/source/ui/app/AppDetailPageHelper.cxx:657:5 (instdir/program/libdbulo.so +0x1725e81)
> #11 in dbaui::OAppDetailPageHelper::createPage(dbaui::ElementType, com::sun::star::uno::Reference<com::sun::star::container::XNameAccess> const&) at dbaccess/source/ui/app/AppDetailPageHelper.cxx:637:9 (instdir/program/libdbulo.so +0x172796e)
> #12 in dbaui::OApplicationDetailView::impl_createPage(dbaui::ElementType, com::sun::star::uno::Reference<com::sun::star::sdbc::XConnection> const&, com::sun::star::uno::Reference<com::sun::star::container::XNameAccess> const&) at dbaccess/source/ui/app/AppDetailView.cxx:647:27 (instdir/program/libdbulo.so +0x1780e95)
> #13 in dbaui::OApplicationDetailView::createPage(dbaui::ElementType, com::sun::star::uno::Reference<com::sun::star::container::XNameAccess> const&) at dbaccess/source/ui/app/AppDetailView.cxx:626:5 (instdir/program/libdbulo.so +0x17810c9)
> #14 in dbaui::OApplicationController::onContainerSelect(dbaui::ElementType) at dbaccess/source/ui/app/AppController.cxx:1695:46 (instdir/program/libdbulo.so +0x161a37e)
> #15 in dbaui::OApplicationSwapWindow::onContainerSelected(dbaui::ElementType) at dbaccess/source/ui/app/AppSwapWindow.cxx:139:53 (instdir/program/libdbulo.so +0x17c5310)
> #16 in dbaui::OApplicationSwapWindow::OnContainerSelectHdl(SvtIconChoiceCtrl*) at dbaccess/source/ui/app/AppSwapWindow.cxx:157:9 (instdir/program/libdbulo.so +0x17c5908)
> #17 in dbaui::OApplicationSwapWindow::LinkStubOnContainerSelectHdl(void*, SvtIconChoiceCtrl*) at dbaccess/source/ui/app/AppSwapWindow.cxx:150:1 (instdir/program/libdbulo.so +0x17c0a90)
> #18 in Link<SvtIconChoiceCtrl*, void>::Call(SvtIconChoiceCtrl*) const at include/tools/link.hxx:84:45 (instdir/program/libsvtlo.so +0x15a0863)
> #19 in SvtIconChoiceCtrl::ClickIcon() at svtools/source/contnr/ivctrl.cxx:276:20 (instdir/program/libsvtlo.so +0x159c680)
> #20 in SvxIconChoiceCtrl_Impl::CallSelectHandler() at svtools/source/contnr/imivctl1.cxx:3386:16 (instdir/program/libsvtlo.so +0x15194ef)
> #21 in SvxIconChoiceCtrl_Impl::SelectEntry(SvxIconChoiceCtrlEntry*, bool, bool) at svtools/source/contnr/imivctl1.cxx:384:9 (instdir/program/libsvtlo.so +0x1518f4d)
> #22 in SvxIconChoiceCtrl_Impl::SetCursor(SvxIconChoiceCtrlEntry*) at svtools/source/contnr/imivctl1.cxx:2001:13 (instdir/program/libsvtlo.so +0x1519c69)
> #23 in SvtIconChoiceCtrl::SetCursor(SvxIconChoiceCtrlEntry*) at svtools/source/contnr/ivctrl.cxx:310:13 (instdir/program/libsvtlo.so +0x159d140)
> #24 in dbaui::OApplicationSwapWindow::selectContainer(dbaui::ElementType) at dbaccess/source/ui/app/AppSwapWindow.cxx:179:25 (instdir/program/libdbulo.so +0x17c6415)
> #25 in dbaui::OApplicationView::selectContainer(dbaui::ElementType) at dbaccess/source/ui/app/AppView.cxx:441:17 (instdir/program/libdbulo.so +0x17e2df6)
> #26 in dbaui::OApplicationController::OnSelectContainer(void*) at dbaccess/source/ui/app/AppController.cxx:1873:25 (instdir/program/libdbulo.so +0x161ef9d)
> #27 in dbaui::OApplicationController::LinkStubOnSelectContainer(void*, void*) at dbaccess/source/ui/app/AppController.cxx:1869:1 (instdir/program/libdbulo.so +0x15e6660)
> #28 in Link<void*, void>::Call(void*) const at include/tools/link.hxx:84:45 (instdir/program/libdbulo.so +0x1814063)
> #29 in dbaui::OAsynchronousLink::OnAsyncCall(void*) at dbaccess/source/ui/browser/AsynchronousLink.cxx:80:16 (instdir/program/libdbulo.so +0x1813e7b)
> #30 in dbaui::OAsynchronousLink::LinkStubOnAsyncCall(void*, void*) at dbaccess/source/ui/browser/AsynchronousLink.cxx:67:1 (instdir/program/libdbulo.so +0x1813b7e)
> #31 in Link<void*, void>::Call(void*) const at include/tools/link.hxx:84:45 (instdir/program/libvcllo.so +0x3829953)
> #32 in ImplHandleUserEvent(ImplSVEvent*) at vcl/source/window/winproc.cxx:1929:30 (instdir/program/libvcllo.so +0x381d774)
> #33 in ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at vcl/source/window/winproc.cxx:2482:13 (instdir/program/libvcllo.so +0x380e97f)
> #34 in SalFrame::CallCallback(SalEvent, void const*) const at vcl/inc/salframe.hxx:280:29 (instdir/program/libvcllo.so +0x53690fa)
> #35 in SvpSalInstance::ProcessEvent(SalUserEventList::SalUserEvent) at vcl/headless/svpinst.cxx:280:22 (instdir/program/libvcllo.so +0x53adf67)
> #36 in SalUserEventList::DispatchUserEvents(bool) at vcl/source/app/salusereventlist.cxx:109:17 (instdir/program/libvcllo.so +0x4bdc0c3)
> #37 in SvpSalInstance::DoYield(bool, bool) at vcl/headless/svpinst.cxx:414:19 (instdir/program/libvcllo.so +0x53b1464)
> #38 in ImplYield(bool, bool) at vcl/source/app/svapp.cxx:471:48 (instdir/program/libvcllo.so +0x4d4d08a)
> #39 in Application::Reschedule(bool) at vcl/source/app/svapp.cxx:488:12 (instdir/program/libvcllo.so +0x4d35650)
> #40 in framework::StatusIndicatorFactory::impl_reschedule(bool) at framework/source/helper/statusindicatorfactory.cxx:523:13 (instdir/program/libfwklo.so +0xe3c97f)
> #41 in framework::StatusIndicatorFactory::start(com::sun::star::uno::Reference<com::sun::star::task::XStatusIndicator> const&, rtl::OUString const&, int) at framework/source/helper/statusindicatorfactory.cxx:143:5 (instdir/program/libfwklo.so +0xe3a336)
> #42 in framework::StatusIndicator::start(rtl::OUString const&, int) at framework/source/helper/statusindicator.cxx:51:19 (instdir/program/libfwklo.so +0xe334f8)
> #43 in dbaccess::(anonymous namespace)::lcl_triggerStatusIndicator_throw(comphelper::NamedValueCollection const&, dbaccess::DocumentGuard&, bool) at dbaccess/source/core/dataaccess/databasedocument.cxx:270:35 (instdir/program/libdbalo.so +0x114b3b3)
> #44 in dbaccess::ODatabaseDocument::impl_storeToStorage_throw(com::sun::star::uno::Reference<com::sun::star::embed::XStorage> const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, dbaccess::DocumentGuard&) const at dbaccess/source/core/dataaccess/databasedocument.cxx:1219:9 (instdir/program/libdbalo.so +0x1138ffd)
> #45 in dbaccess::ODatabaseDocument::impl_storeAs_throw(rtl::OUString const&, comphelper::NamedValueCollection const&, dbaccess::ODatabaseDocument::StoreType, dbaccess::DocumentGuard&) at dbaccess/source/core/dataaccess/databasedocument.cxx:1064:9 (instdir/program/libdbalo.so +0x11484f3)
> #46 in dbaccess::ODatabaseDocument::store() at dbaccess/source/core/dataaccess/databasedocument.cxx:966:9 (instdir/program/libdbalo.so +0x11457bc)
> #47 in DialogSaveTest::test() at dbaccess/qa/extras/dialog-save.cxx:98:23 (workdir/LinkTarget/CppunitTest/libtest_dbaccess_dialog_save.so +0x1fb5a)
Change-Id: I7be2e468f9101d247f6247eb5e63393d711c0de2
Reviewed-on: https://gerrit.libreoffice.org/59067
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r-- | svtools/source/contnr/svimpbox.cxx | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/svtools/source/contnr/svimpbox.cxx b/svtools/source/contnr/svimpbox.cxx index 69c866324279..0ae2d0caf635 100644 --- a/svtools/source/contnr/svimpbox.cxx +++ b/svtools/source/contnr/svimpbox.cxx @@ -1311,10 +1311,12 @@ void SvImpLBox::FillView() { if( !pStartEntry ) { - sal_uInt16 nVisibleViewCount = static_cast<sal_uInt16>(pView->GetVisibleCount()); - sal_uInt16 nTempThumb = static_cast<sal_uInt16>(aVerSBar->GetThumbPos()); - if( nTempThumb >= nVisibleViewCount ) - nTempThumb = nVisibleViewCount - 1; + sal_uLong nVisibleViewCount = pView->GetVisibleCount(); + long nTempThumb = aVerSBar->GetThumbPos(); + if( nTempThumb < 0 ) + nTempThumb = 0; + else if( static_cast<unsigned long>(nTempThumb) >= nVisibleViewCount ) + nTempThumb = nVisibleViewCount == 0 ? 0 : nVisibleViewCount - 1; pStartEntry = pView->GetEntryAtVisPos(nTempThumb); } if( !pStartEntry ) |