From 749ef30c823e595f42e9844fb438441250389a0a Mon Sep 17 00:00:00 2001
From: Stephan Bergmann <sbergman@redhat.com>
Date: Thu, 25 Oct 2018 10:18:03 +0200
Subject: Fix
 external/hunspell/0001-recent-Hunspell-fixes-for-suggestion-spelling-...
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

...introduced with b691e5824a6346d2fe7f702b5280b56532a2f89e "tdf#118162 spell
checking: fix freezing and add missing OCONV", leaving
HunspellImpl::suggest_internal's newly introduced out-parameters uninitialized
when the function returns early, causing HunspellImpl::suggest to use capwords
uninitialized, as seen when invoking spell-checking in LO built with UBSan:

> hunspell.cxx:907:7: runtime error: load of value 160, which is not a valid value for type 'bool'
>  #0 in HunspellImpl::suggest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) at workdir/UnpackedTarball/hunspell/src/hunspell/hunspell.cxx:907:7 (instdir/program/../program/libspelllo.so +0x288ccd)
>  #1 in Hunspell::suggest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) at workdir/UnpackedTarball/hunspell/src/hunspell/hunspell.cxx:888:18 (instdir/program/../program/libspelllo.so +0x288693)
>  #2 in SpellChecker::GetProposals(rtl::OUString const&, com::sun::star::lang::Locale const&) at lingucomponent/source/spellcheck/spell/sspellimp.cxx:467:56 (instdir/program/../program/libspelllo.so +0x202913)
>  #3 in SpellChecker::spell(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at lingucomponent/source/spellcheck/spell/sspellimp.cxx:520:17 (instdir/program/../program/libspelllo.so +0x203b84)
>  #4 in non-virtual thunk to SpellChecker::spell(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at lingucomponent/source/spellcheck/spell/sspellimp.cxx (instdir/program/../program/libspelllo.so +0x203e62)
>  #5 in SpellCheckerDispatcher::spell_Impl(rtl::OUString const&, o3tl::strong_int<unsigned short, LanguageTypeTag>, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at linguistic/source/spelldsp.cxx:484:44 (instdir/program/liblnglo.so +0x672505)
>  #6 in SpellCheckerDispatcher::spell(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at linguistic/source/spelldsp.cxx:227:12 (instdir/program/liblnglo.so +0x670040)
>  #7 in SpellCheckerDispatcher::spell(rtl::OUString const&, short, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at linguistic/source/spelldsp.cxx:768:12 (instdir/program/liblnglo.so +0x67b353)
>  #8 in non-virtual thunk to SpellCheckerDispatcher::spell(rtl::OUString const&, short, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at linguistic/source/spelldsp.cxx (instdir/program/liblnglo.so +0x67b538)
>  #9 in Thesaurus::queryMeanings(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at lingucomponent/source/thesaurus/libnth/nthesimp.cxx:433:27 (instdir/program/../program/liblnthlo.so +0x88315)
>  #10 in non-virtual thunk to Thesaurus::queryMeanings(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at lingucomponent/source/thesaurus/libnth/nthesimp.cxx (instdir/program/../program/liblnthlo.so +0x8a322)
>  #11 in ThesaurusDispatcher::queryMeanings(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at linguistic/source/thesdsp.cxx:181:40 (instdir/program/liblnglo.so +0x6b6fa5)
>  #12 in non-virtual thunk to ThesaurusDispatcher::queryMeanings(rtl::OUString const&, com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at linguistic/source/thesdsp.cxx (instdir/program/liblnglo.so +0x6b7ca2)
>  #13 in ThesaurusMenuController::getMeanings(std::__debug::vector<rtl::OUString, std::allocator<rtl::OUString> >&, rtl::OUString const&, com::sun::star::lang::Locale const&, unsigned long) at framework/source/uielement/thesaurusmenucontroller.cxx:117:31 (instdir/program/../program/libfwklo.so +0x1be1a9a)
>  #14 in ThesaurusMenuController::fillPopupMenu() at framework/source/uielement/thesaurusmenucontroller.cxx:75:5 (instdir/program/../program/libfwklo.so +0x1bdf973)
>  #15 in ThesaurusMenuController::statusChanged(com::sun::star::frame::FeatureStateEvent const&) at framework/source/uielement/thesaurusmenucontroller.cxx:63:9 (instdir/program/../program/libfwklo.so +0x1bdf24d)
>  #16 in SfxDispatchController_Impl::addStatusListener(com::sun::star::uno::Reference<com::sun::star::frame::XStatusListener> const&, com::sun::star::util::URL const&) at sfx2/source/control/unoctitm.cxx:861:16 (instdir/program/libsfxlo.so +0x2b6851f)
>  #17 in SfxOfficeDispatch::addStatusListener(com::sun::star::uno::Reference<com::sun::star::frame::XStatusListener> const&, com::sun::star::util::URL const&) at sfx2/source/control/unoctitm.cxx:249:16 (instdir/program/libsfxlo.so +0x2b671d4)
>  #18 in svt::PopupMenuControllerBase::updateCommand(rtl::OUString const&) at svtools/source/uno/popupmenucontrollerbase.cxx:189:20 (instdir/program/libsvtlo.so +0x2b0ef9e)
>  #19 in svt::PopupMenuControllerBase::updatePopupMenu() at svtools/source/uno/popupmenucontrollerbase.cxx:173:5 (instdir/program/libsvtlo.so +0x2b0e66f)
>  #20 in svt::PopupMenuControllerBase::setPopupMenu(com::sun::star::uno::Reference<com::sun::star::awt::XPopupMenu> const&) at svtools/source/uno/popupmenucontrollerbase.cxx:357:5 (instdir/program/libsvtlo.so +0x2b13e92)
>  #21 in framework::MenuBarManager::CreatePopupMenuController(framework::MenuBarManager::MenuItemHandler*) at framework/source/uielement/menubarmanager.cxx:984:31 (instdir/program/../program/libfwklo.so +0x1a9ff7e)
>  #22 in framework::MenuBarManager::Activate(Menu*) at framework/source/uielement/menubarmanager.cxx:737:50 (instdir/program/../program/libfwklo.so +0x1a94daa)
>  #23 in framework::MenuBarManager::LinkStubActivate(void*, Menu*) at framework/source/uielement/menubarmanager.cxx:605:1 (instdir/program/../program/libfwklo.so +0x1a8f150)
>  #24 in Link<Menu*, bool>::Call(Menu*) const at include/tools/link.hxx:84:45 (instdir/program/libvcllo.so +0x3bda2ae)
>  #25 in Menu::Activate() at vcl/source/window/menu.cxx:269:28 (instdir/program/libvcllo.so +0x3b75b01)
>  #26 in PopupMenu::ImplExecute(VclPtr<vcl::Window> const&, tools::Rectangle const&, FloatWinPopupFlags, Menu*, bool) at vcl/source/window/menu.cxx:2849:5 (instdir/program/libvcllo.so +0x3bcc12e)
>  #27 in PopupMenu::Execute(vcl::Window*, tools::Rectangle const&, PopupMenuFlags) at vcl/source/window/menu.cxx:2788:12 (instdir/program/libvcllo.so +0x3bc95d6)
>  #28 in PopupMenu::Execute(vcl::Window*, Point const&) at vcl/source/window/menu.cxx:2763:12 (instdir/program/libvcllo.so +0x3bc8c20)
>  #29 in SfxDispatcher::ExecutePopup(rtl::OUString const&, vcl::Window*, Point const*) at sfx2/source/control/dispatch.cxx:1857:23 (instdir/program/libsfxlo.so +0x27980ec)
>  #30 in SfxDispatcher::ExecutePopup(vcl::Window*, Point const*) at sfx2/source/control/dispatch.cxx:1806:19 (instdir/program/libsfxlo.so +0x279500f)
>  #31 in SwEditWin::Command(CommandEvent const&) at sw/source/uibase/docvw/edtwin.cxx:5224:25 (instdir/program/../program/libswlo.so +0xd546dd0)
>  #32 in ImplCallCommand(VclPtr<vcl::Window> const&, CommandEventId, void const*, bool, Point const*) at vcl/source/window/winproc.cxx:228:17 (instdir/program/libvcllo.so +0x4283a3c)
>  #33 in ImplHandleMouseEvent(VclPtr<vcl::Window> const&, MouseNotifyEvent, bool, long, long, unsigned long, unsigned short, MouseEventModifiers) at vcl/source/window/winproc.cxx:792:34 (instdir/program/libvcllo.so +0x427e12e)
>  #34 in ImplHandleSalMouseButtonDown(vcl::Window*, SalMouseEvent const*) at vcl/source/window/winproc.cxx:1982:12 (instdir/program/libvcllo.so +0x429c206)
>  #35 in ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at vcl/source/window/winproc.cxx:2316:20 (instdir/program/libvcllo.so +0x4296785)
>  #36 in SalFrame::CallCallback(SalEvent, void const*) const at vcl/inc/salframe.hxx:280:29 (instdir/program/libvclplug_gtk3lo.so +0xb9badd)
>  #37 in GtkSalFrame::CallCallbackExc(SalEvent, void const*) const at vcl/unx/gtk3/gtk3gtkframe.cxx:4477:16 (instdir/program/libvclplug_gtk3lo.so +0xb139f3)
>  #38 in GtkSalFrame::signalButton(_GtkWidget*, _GdkEventButton*, void*) at vcl/unx/gtk3/gtk3gtkframe.cxx:2690:16 (instdir/program/libvclplug_gtk3lo.so +0xb2f96e)
>  #39 in _gtk_marshal_BOOLEAN__BOXED at /usr/src/debug/gtk3-3.24.1-1.fc29.x86_64/gtk/gtkmarshalers.c:83:14 (/lib64/libgtk-3.so.0 +0x3e16fa)
[...]

Change-Id: I613bf37ded8c525301297d96e0d33826c9a48215
Reviewed-on: https://gerrit.libreoffice.org/62345
Reviewed-by: László Németh <nemeth@numbertext.org>
Tested-by: Jenkins
---
 ...cent-Hunspell-fixes-for-suggestion-spelling-and-an.patch | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/external/hunspell/0001-recent-Hunspell-fixes-for-suggestion-spelling-and-an.patch b/external/hunspell/0001-recent-Hunspell-fixes-for-suggestion-spelling-and-an.patch
index 7c9b255abe74..d4d822f92185 100644
--- a/external/hunspell/0001-recent-Hunspell-fixes-for-suggestion-spelling-and-an.patch
+++ b/external/hunspell/0001-recent-Hunspell-fixes-for-suggestion-spelling-and-an.patch
@@ -574,33 +574,34 @@ index d6e871f..0dcd748 100644
    // output conversion
    RepList* rl = (pAMgr) ? pAMgr->get_oconvtable() : NULL;
    if (rl) {
-@@ -902,7 +979,8 @@ std::vector<std::string> HunspellImpl::suggest(const std::string& word) {
+@@ -902,7 +979,12 @@ std::vector<std::string> HunspellImpl::suggest(const std::string& word) {
    return slst;
  }
  
 -std::vector<std::string> HunspellImpl::suggest_internal(const std::string& word) {
 +std::vector<std::string> HunspellImpl::suggest_internal(const std::string& word,
 +        bool& capwords, size_t& abbv, int& captype) {
++  captype = NOCAP;
++  abbv = 0;
++  capwords = false;
++
    std::vector<std::string> slst;
  
    int onlycmpdsug = 0;
-@@ -920,8 +998,8 @@ std::vector<std::string> HunspellImpl::suggest_internal(const std::string& word)
+@@ -920,8 +998,6 @@ std::vector<std::string> HunspellImpl::suggest_internal(const std::string& word)
      if (word.size() >= MAXWORDLEN)
        return slst;
    }
 -  int captype = NOCAP;
 -  size_t abbv = 0;
-+  captype = NOCAP;
-+  abbv = 0;
    size_t wl = 0;
  
    std::string scw;
-@@ -942,9 +1020,13 @@ std::vector<std::string> HunspellImpl::suggest_internal(const std::string& word)
+@@ -942,9 +1020,12 @@ std::vector<std::string> HunspellImpl::suggest_internal(const std::string& word)
        return slst;
    }
  
 -  int capwords = 0;
-+  capwords = false;
    bool good = false;
  
 +  HUNSPELL_THREAD_LOCAL clock_t timelimit;
-- 
cgit