|
(cf. core commit f0a3678ef3b048d166179513670633e1bb3acfb8 "Fix 'Adding Central
Kurdish(ckb) Spell Checker & Dictionary'"), which caused builds like
<https://ci.libreoffice.org/job/lo_daily_tb_win/929/> to fail with
> /usr/bin/sh: line 1: 51209 Segmentation fault PATH="/home/tdf/jenkins/daily_workspace/tb/build_master/instdir/program:/home/tdf/jenkins/daily_workspace/tb/build_master/instdir/program:$PATH" $W/LinkTarget/Executable/ulfex.exe -i $S/scp2/source/ooo/module_ooo.ulf -o $W/ScpMergeTarget/scp2/source/ooo/module_ooo.ulf -m ${MERGEINPUT} -l all
> make[1]: *** [C:/cygwin/home/tdf/jenkins/daily_workspace/tb/src_master/solenv/gbuild/InstallModuleTarget.mk:113: C:/cygwin/home/tdf/jenkins/daily_workspace/tb/build_master/workdir/ScpMergeTarget/scp2/source/ooo/module_ooo.ulf] Error 139
> make[1]: *** Deleting file 'C:/cygwin/home/tdf/jenkins/daily_workspace/tb/build_master/workdir/ScpMergeTarget/scp2/source/ooo/module_ooo.ulf'
because of (as seen with a corresponding ASan build)
> ==250602==ERROR: AddressSanitizer: heap-use-after-free on address 0x6160000060b0 at pc 0x0000003845f4 bp 0x7ffdb0cb81f0 sp 0x7ffdb0cb81e8
> READ of size 8 at 0x6160000060b0 thread T0
> #0 in std::_Hashtable<rtl::OString, std::pair<rtl::OString const, rtl::OString>, std::allocator<std::pair<rtl::OString const, rtl::OString> >, std::__detail::_Select1st, std::equal_to<rtl::OString>, std::hash<rtl::OString>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_bucket_index(unsigned long) const at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/hashtable.h:796:55
> #1 in std::__detail::_Map_base<rtl::OString, std::pair<rtl::OString const, rtl::OString>, std::allocator<std::pair<rtl::OString const, rtl::OString> >, std::__detail::_Select1st, std::equal_to<rtl::OString>, std::hash<rtl::OString>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true>, true>::operator[](rtl::OString const&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/hashtable_policy.h:772:32
> #2 in std::__cxx1998::unordered_map<rtl::OString, rtl::OString, std::hash<rtl::OString>, std::equal_to<rtl::OString>, std::allocator<std::pair<rtl::OString const, rtl::OString> > >::operator[](rtl::OString const&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/unordered_map.h:980:16
> #3 in MergeEntrys::InsertEntry(rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&) at l10ntools/inc/export.hxx:93:9
> #4 in MergeDataFile::InsertEntry(std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&, bool, bool) at l10ntools/source/merge.cxx:317:23
> #5 in MergeDataFile::MergeDataFile(rtl::OString const&, rtl::OString const&, bool, bool) at l10ntools/source/merge.cxx:205:13
> #6 in LngParser::Merge(rtl::OString const&, rtl::OString const&, rtl::OString const&) at l10ntools/source/lngmerge.cxx:154:19
> #7 in sal_main_with_args(int, char**) at l10ntools/source/lngex.cxx:39:17
> #8 in main at l10ntools/source/lngex.cxx:28:1
>
> 0x6160000060b0 is located 48 bytes inside of 576-byte region [0x616000006080,0x6160000062c0)
> freed by thread T0 here:
> #0 in operator delete(void*, unsigned long) at ~/github.com/llvm/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:164:3
> #1 in std::default_delete<MergeEntrys>::operator()(MergeEntrys*) const at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/unique_ptr.h:85:2
> #2 in std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >::~unique_ptr() at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/unique_ptr.h:365:4
> #3 in std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >::~pair() at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/stl_pair.h:185:12
> #4 in void std::destroy_at<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > >(std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >*) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/stl_construct.h:88:15
> #5 in void std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, true> > >::destroy<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > >(std::allocator<std::__detail::_Hash_node<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, true> >&, std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >*) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/alloc_traits.h:537:4
> #6 in std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, true> > >::_M_deallocate_node(std::__detail::_Hash_node<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, true>*) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/hashtable_policy.h:1982:7
> #7 in std::_Hashtable<rtl::OString, std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > >, std::__detail::_Select1st, std::equal_to<rtl::OString>, std::hash<rtl::OString>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_Scoped_node::~_Scoped_node() at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/hashtable.h:310:39
> #8 in std::pair<std::__detail::_Node_iterator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, false, true>, bool> std::_Hashtable<rtl::OString, std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > >, std::__detail::_Select1st, std::equal_to<rtl::OString>, std::hash<rtl::OString>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_emplace<rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >(std::integral_constant<bool, true>, rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/hashtable.h:2082:7
> #9 in std::pair<std::__detail::_Node_iterator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, false, true>, bool> std::_Hashtable<rtl::OString, std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > >, std::__detail::_Select1st, std::equal_to<rtl::OString>, std::hash<rtl::OString>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::emplace<rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >(rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/hashtable.h:948:11
> #10 in std::pair<std::__detail::_Node_iterator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, false, true>, bool> std::__cxx1998::unordered_map<rtl::OString, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >, std::hash<rtl::OString>, std::equal_to<rtl::OString>, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > > >::emplace<rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >(rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/bits/unordered_map.h:389:16
> #11 in std::pair<__gnu_debug::_Safe_iterator<std::__detail::_Node_iterator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >, false, true>, std::__debug::unordered_map<rtl::OString, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >, std::hash<rtl::OString>, std::equal_to<rtl::OString>, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > > >, std::forward_iterator_tag>, bool> std::__debug::unordered_map<rtl::OString, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >, std::hash<rtl::OString>, std::equal_to<rtl::OString>, std::allocator<std::pair<rtl::OString const, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > > > >::emplace<rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> > >(rtl::OString&, std::unique_ptr<MergeEntrys, std::default_delete<MergeEntrys> >&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.1/../../../../include/c++/12.0.1/debug/unordered_map:334:24
> #12 in MergeDataFile::InsertEntry(std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&, bool, bool) at l10ntools/source/merge.cxx:301:14
> #13 in MergeDataFile::MergeDataFile(rtl::OString const&, rtl::OString const&, bool, bool) at l10ntools/source/merge.cxx:205:13
> #14 in LngParser::Merge(rtl::OString const&, rtl::OString const&, rtl::OString const&) at l10ntools/source/lngmerge.cxx:154:19
> #15 in sal_main_with_args(int, char**) at l10ntools/source/lngex.cxx:39:17
> #16 in main at l10ntools/source/lngex.cxx:28:1
>
> previously allocated by thread T0 here:
> #0 in operator new(unsigned long) at ~/github.com/llvm/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:95:3
> #1 in MergeDataFile::InsertEntry(std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&, rtl::OString const&, bool, bool) at l10ntools/source/merge.cxx:300:24
> #2 in MergeDataFile::MergeDataFile(rtl::OString const&, rtl::OString const&, bool, bool) at l10ntools/source/merge.cxx:205:13
> #3 in LngParser::Merge(rtl::OString const&, rtl::OString const&, rtl::OString const&) at l10ntools/source/lngmerge.cxx:154:19
> #4 in sal_main_with_args(int, char**) at l10ntools/source/lngex.cxx:39:17
> #5 in main at l10ntools/source/lngex.cxx:28:1
(which will be addressed with a modification to core l10ntools/source/merge.cxx,
to reliably abort Executable_ulfex upon such bad input)
Change-Id: I05f52a3650b57548e2035f6521d582a607d68c0d
Reviewed-on: https://gerrit.libreoffice.org/c/translations/+/130217
Tested-by: Stephan Bergmann <sbergman@redhat.com>
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
|