vcl/source/image/ImplImageTree.cxx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
New commits: commit 4ebfd85322beffed953db01121a45c4a8a12cd59 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Mon May 16 10:41:36 2022 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Mon May 16 16:11:45 2022 +0200 Revert "use more string_view in getNameNoExtension" This reverts commit d4f2b8eb74f430f5fc3622d668b33df1f99a0c1d, as it causes heap-use-after-free, e.g. during CppunitTest_dbaccess_hsqldb_test, > ==24944==ERROR: AddressSanitizer: heap-use-after-free on address 0x6070001a04a8 at pc 0x0000004b6b42 bp 0x7fff0f651490 sp 0x7fff0f650c40 > READ of size 56 at 0x6070001a04a8 thread T0 > #0 0x4b6b41 in __asan_memcpy /home/tdf/lode/packages/llvm-llvmorg-12.0.1.src/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:22 > #1 0x7f315931e373 in rtl::addDataHelper(char16_t*, char16_t const*, unsigned long) /include/rtl/stringconcat.hxx:89:9 > #2 0x7f3159beb290 in rtl::ToStringHelper<std::basic_string_view<char16_t, std::char_traits<char16_t> > >::addData(char16_t*, std::basic_string_view<char16_t, std::char_traits<char16_t> >) /include/rtl/stringconcat.hxx:553:14 > #3 0x7f3159beb7ea in rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >::addData(char16_t*) const /include/rtl/stringconcat.hxx:252:88 > #4 0x7f3159beb59d in rtl::ToStringHelper<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > > >::addData(char16_t*, rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > > const&) /include/rtl/stringconcat.hxx:271:122 > #5 0x7f315c3dc450 in rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>::addData(char16_t*) const /include/rtl/stringconcat.hxx:252:119 > #6 0x7f315c3c41b2 in rtl::OUString::OUString<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>(rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>&&) /include/rtl/ustring.hxx:495:34 > #7 0x7f315c3eb066 in void __gnu_cxx::new_allocator<rtl::OUString>::construct<rtl::OUString, rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]> >(rtl::OUString*, rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>&&) /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/../../../../include/c++/7/ext/new_allocator.h:136:23 > #8 0x7f315c3e9e46 in void std::allocator_traits<std::allocator<rtl::OUString> >::construct<rtl::OUString, rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]> >(std::allocator<rtl::OUString>&, rtl::OUString*, rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>&&) /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/../../../../include/c++/7/bits/alloc_traits.h:475:8 > #9 0x7f315c3ea266 in void std::__cxx1998::vector<rtl::OUString, std::allocator<rtl::OUString> >::_M_realloc_insert<rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]> >(__gnu_cxx::__normal_iterator<rtl::OUString*, std::__cxx1998::vector<rtl::OUString, std::allocator<rtl::OUString> > >, rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>&&) /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/../../../../include/c++/7/bits/vector.tcc:415:4 > #10 0x7f315c3e9c59 in rtl::OUString& std::__cxx1998::vector<rtl::OUString, std::allocator<rtl::OUString> >::emplace_back<rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]> >(rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>&&) /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/../../../../include/c++/7/bits/vector.tcc:105:4 > #11 0x7f315c3bc742 in rtl::OUString& std::__debug::vector<rtl::OUString, std::allocator<rtl::OUString> >::emplace_back<rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]> >(rtl::OUStringConcat<rtl::OUStringConcat<rtl::OUStringConcatMarker, std::basic_string_view<char16_t, std::char_traits<char16_t> > >, char const [5]>&&) /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/../../../../include/c++/7/debug/vector:489:11 > #12 0x7f315c3a7729 in ImplImageTree::getPaths(rtl::OUString const&, LanguageTag const&) /vcl/source/image/ImplImageTree.cxx:226:20 [...] (<https://ci.libreoffice.org//job/lo_ubsan/2399/>) Change-Id: I3af57646bc97c33aad4570a4d6b68dff340b4c64 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134390 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/vcl/source/image/ImplImageTree.cxx b/vcl/source/image/ImplImageTree.cxx index ae9baacd55ca..5f2d1e94af6a 100644 --- a/vcl/source/image/ImplImageTree.cxx +++ b/vcl/source/image/ImplImageTree.cxx @@ -134,10 +134,10 @@ bool urlExists(OUString const & sUrl) return osl::FileBase::E_None == eRC; } -std::u16string_view getNameNoExtension(std::u16string_view sName) +OUString getNameNoExtension(std::u16string_view sName) { size_t nDotPosition = sName.rfind('.'); - return sName.substr(0, nDotPosition); + return OUString(sName.substr(0, nDotPosition)); } std::shared_ptr<SvMemoryStream> wrapStream(uno::Reference<io::XInputStream> const & rInputStream) @@ -222,15 +222,15 @@ std::vector<OUString> ImplImageTree::getPaths(OUString const & name, LanguageTag { for (const OUString& rFallback : rLanguageTag.getFallbackStrings(true)) { - std::u16string_view aFallbackName = getNameNoExtension(getRealImageName(createPath(name, pos, rFallback))); - sPaths.emplace_back(OUString::Concat(aFallbackName) + ".png"); - sPaths.emplace_back(OUString::Concat(aFallbackName) + ".svg"); + OUString aFallbackName = getNameNoExtension(getRealImageName(createPath(name, pos, rFallback))); + sPaths.emplace_back(aFallbackName + ".png"); + sPaths.emplace_back(aFallbackName + ".svg"); } } - std::u16string_view aRealName = getNameNoExtension(getRealImageName(name)); - sPaths.emplace_back(OUString::Concat(aRealName) + ".png"); - sPaths.emplace_back(OUString::Concat(aRealName) + ".svg"); + OUString aRealName = getNameNoExtension(getRealImageName(name)); + sPaths.emplace_back(aRealName + ".png"); + sPaths.emplace_back(aRealName + ".svg"); return sPaths; } @@ -624,15 +624,15 @@ OUString const & ImplImageTree::getRealImageName(OUString const & rIconName) { IconLinkHash & rLinkHash = maIconSets[maCurrentStyle].maLinkHash; - std::u16string_view sNameWithNoExtension = getNameNoExtension(rIconName); + OUString sNameWithNoExtension = getNameNoExtension(rIconName); // PNG is priority - auto it = rLinkHash.find(OUString::Concat(sNameWithNoExtension) + ".png"); + auto it = rLinkHash.find(sNameWithNoExtension + ".png"); if (it != rLinkHash.end()) return it->second; // also check SVG name - it = rLinkHash.find(OUString::Concat(sNameWithNoExtension) + ".svg"); + it = rLinkHash.find(sNameWithNoExtension + ".svg"); if (it != rLinkHash.end()) return it->second;