Attached is part of a Valgrind log (the full log is 1MB, let me know if you want to go leak hunting). I was trying to investigate https://www.lyx.org/trac/ticket/12510. I get the Valgrind message when opening probability8.lyx on that ticket.
Also attached is a possible patch that fixes this particular invalid read. However, I have no idea why the unpatched code triggers an invalid read, nor why the patch would fix it. Does anyone have an idea? Scott
==2365082== Memcheck, a memory error detector ==2365082== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==2365082== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info ==2365082== Command: /home/scott/lyxbuilds/master/CMakeBuild/bin/lyx -userdir /home/scott/lyxbuilds/master/user-dir probability8.lyx ==2365082== Parent PID: 2359215 ==2365082== ==2365082== Invalid read of size 32 ==2365082== at 0x617DB5D: __wmemcmp_avx2_movbe (memcmp-avx2-movbe.S:413) ==2365082== by 0x8EDEF8: std::char_traits<wchar_t>::compare(wchar_t const*, wchar_t const*, unsigned long) (char_traits.h:485) ==2365082== by 0x90C9B5: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::compare(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (basic_string.h:2878) ==2365082== by 0x908D50: _ZStssIwSt11char_traitsIwESaIwEEDTcl21__char_traits_cmp_catIT0_ELi0EEERKNSt7__cxx1112basic_stringIT_S3_T1_EESB_ (basic_string.h:6263) ==2365082== by 0x909708: std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >::operator()(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (stl_function.h:386) ==2365082== by 0xD8F847: std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_tree.h:2177) ==2365082== by 0xD8F3CE: std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<> >(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&&, std::tuple<>&&) (stl_tree.h:2433) ==2365082== by 0xD8F143: std::map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, lyx::(anonymous namespace)::deco_struct, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::operator[](std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_map.h:501) ==2365082== by 0xD8C26D: lyx::(anonymous namespace)::init_deco_table::init_deco_table() (MathSupport.cpp:536) ==2365082== by 0xD9065B: __static_initialization_and_destruction_0(int, int) (MathSupport.cpp:541) ==2365082== by 0xD91B0A: _GLOBAL__sub_I_MathSupport.cpp (MathSupport.cpp:1120) ==2365082== by 0x60080FC: call_init (libc-start.c:145) ==2365082== by 0x60080FC: __libc_start_main@@GLIBC_2.34 (libc-start.c:379) ==2365082== Address 0x8b28cb0 is 0 bytes inside a block of size 28 alloc'd ==2365082== at 0x4843FB3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==2365082== by 0x8F1469: __gnu_cxx::new_allocator<wchar_t>::allocate(unsigned long, void const*) (new_allocator.h:127) ==2365082== by 0x8EF91E: allocate (allocator.h:197) ==2365082== by 0x8EF91E: std::allocator_traits<std::allocator<wchar_t> >::allocate(std::allocator<wchar_t>&, unsigned long) (alloc_traits.h:460) ==2365082== by 0x8F1533: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_create(unsigned long&, unsigned long) (basic_string.tcc:153) ==2365082== by 0x8F112E: void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct<wchar_t*>(wchar_t*, wchar_t*, std::forward_iterator_tag) (basic_string.tcc:219) ==2365082== by 0x8F061B: void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct_aux<wchar_t*>(wchar_t*, wchar_t*, std::__false_type) (basic_string.h:255) ==2365082== by 0x8EF5C2: void std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_construct<wchar_t*>(wchar_t*, wchar_t*) (basic_string.h:274) ==2365082== by 0x8EE7A9: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (basic_string.h:459) ==2365082== by 0xD9046D: std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, 0ul, >(std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&, std::tuple<>&, std::_Index_tuple<0ul>, std::_Index_tuple<>) (tuple:1808) ==2365082== by 0xD904B2: std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>(std::piecewise_construct_t, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<>) (tuple:1798) ==2365082== by 0xD902C6: decltype (::new ((void*)(0)) std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>((declval<std::piecewise_construct_t const&>)(), (declval<std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&> >)(), (declval<std::tuple<> >)())) std::construct_at<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<> >(std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>*, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&&, std::tuple<>&&) (stl_construct.h:97) ==2365082== by 0xD90365: void std::allocator_traits<std::allocator<std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > > >::construct<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>, std::tuple<> >(std::allocator<std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >&, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>*, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>&&, std::tuple<>&&) (alloc_traits.h:514) ==2365082== ==2365082== Invalid read of size 32 ==2365082== at 0x617DB59: __wmemcmp_avx2_movbe (memcmp-avx2-movbe.S:412) ==2365082== by 0x8EDEF8: std::char_traits<wchar_t>::compare(wchar_t const*, wchar_t const*, unsigned long) (char_traits.h:485) ==2365082== by 0x90C9B5: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::compare(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (basic_string.h:2878) ==2365082== by 0x908D50: _ZStssIwSt11char_traitsIwESaIwEEDTcl21__char_traits_cmp_catIT0_ELi0EEERKNSt7__cxx1112basic_stringIT_S3_T1_EESB_ (basic_string.h:6263) ==2365082== by 0x909708: std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >::operator()(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const (stl_function.h:386) ==2365082== by 0xD8FC8C: std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >*, std::_Rb_tree_node_base*, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_tree.h:1903) ==2365082== by 0xD8F67E: std::_Rb_tree<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct>, std::_Select1st<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> >, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::lower_bound(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_tree.h:1270) ==2365082== by 0xD8F2D2: std::map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, lyx::(anonymous namespace)::deco_struct, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::lower_bound(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_map.h:1259) ==2365082== by 0xD8F088: std::map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, lyx::(anonymous namespace)::deco_struct, std::less<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, lyx::(anonymous namespace)::deco_struct> > >::operator[](std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (stl_map.h:497) ==2365082== by 0xD8C26D: lyx::(anonymous namespace)::init_deco_table::init_deco_table() (MathSupport.cpp:536) ==2365082== by 0xD9065B: __static_initialization_and_destruction_0(int, int) (MathSupport.cpp:541) ==2365082== by 0xD91B0A: _GLOBAL__sub_I_MathSupport.cpp (MathSupport.cpp:1120) ==2365082== Address 0x8b28f50 is 0 bytes inside a block of size 28 alloc'd ==2365082== at 0x4843FB3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==2365082== by 0x8F1469: __gnu_cxx::new_allocator<wchar_t>::allocate(unsigned long, void const*) (new_allocator.h:127) ==2365082== by 0x8EF91E: allocate (allocator.h:197) ==2365082== by 0x8EF91E: std::allocator_traits<std::allocator<wchar_t> >::allocate(std::allocator<wchar_t>&, unsigned long) (alloc_traits.h:460) ==2365082== by 0x8F1533: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_create(unsigned long&, unsigned long) (basic_string.tcc:153) ==2365082== by 0x8F12F1: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_mutate(unsigned long, unsigned long, wchar_t const*, unsigned long) (basic_string.tcc:307) ==2365082== by 0x90F206: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_replace_aux(unsigned long, unsigned long, unsigned long, wchar_t) (basic_string.tcc:437) ==2365082== by 0x90B295: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::append(unsigned long, wchar_t) (basic_string.h:1272) ==2365082== by 0xA8BA63: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::resize(unsigned long, wchar_t) (basic_string.tcc:377) ==2365082== by 0xA8A4A5: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::resize(unsigned long) (basic_string.h:958) ==2365082== by 0x12B26B7: lyx::from_ascii[abi:cxx11](char const*) (docstring.cpp:39) ==2365082== by 0xD8C257: lyx::(anonymous namespace)::init_deco_table::init_deco_table() (MathSupport.cpp:536) ==2365082== by 0xD9065B: __static_initialization_and_destruction_0(int, int) (MathSupport.cpp:541)
diff --git a/src/mathed/MathSupport.cpp b/src/mathed/MathSupport.cpp index 16019205f1..44271e4516 100644 --- a/src/mathed/MathSupport.cpp +++ b/src/mathed/MathSupport.cpp @@ -524,6 +524,7 @@ named_deco_struct deco_table[] = { map<docstring, deco_struct> deco_list; // sort the table on startup class init_deco_table { public: @@ -533,7 +534,8 @@ public: deco_struct d; d.data = p->data; d.angle = p->angle; - deco_list[from_ascii(p->name)] = d; + docstring d_name = from_ascii(p->name); + deco_list[d_name] = d; } } };
signature.asc
Description: PGP signature
-- lyx-devel mailing list lyx-devel@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-devel