vcl/source/control/fmtfield.cxx |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

New commits:
commit 705768837912d38612ab2b06dba1ca491782b773
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Thu Jun 1 15:13:06 2023 +0200
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Fri Jun 2 08:16:37 2023 +0200

    Cannot self-append OUStringBuffer via concatenation
    
    a5084d15e1b72e303e1628fbff84432036b014a9 "loplugin:stringadd in vcl" had 
dropped
    the intermediary sTemp, but which caused JunitTest_forms_unoapi_1 to fail 
for me
    once with
    
    > ==2657124==ERROR: AddressSanitizer: memcpy-param-overlap: memory ranges 
[0x50c00086ca58,0x50c00086ca6a) and [0x50c00086ca48, 0x50c00086ca5a) overlap
    >  #0 in __asan_memcpy at 
~/github.com/llvm/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:22:3
    >  #1 in char16_t* rtl::addDataHelper<char16_t>(char16_t*, char16_t const*, 
unsigned long) at include/rtl/stringconcat.hxx:80:9
    >  #2 in rtl::ToStringHelper<rtl::OUStringBuffer>::operator()(char16_t*, 
rtl::OUStringBuffer const&) const at include/rtl/ustrbuf.hxx:1765:14
    >  #3 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>::addData(char16_t*) const at 
include/rtl/stringconcat.hxx:195:64
    >  #4 in rtl::ToStringHelper<rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 
0>>::operator()(char16_t*, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0> const&) const at 
include/rtl/stringconcat.hxx:207:101
    >  #5 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 
0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:88
    >  #6 in rtl::ToStringHelper<rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>, char const [4], 0>>::operator()(char16_t*, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 
0> const&) const at include/rtl/stringconcat.hxx:207:101
    >  #7 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 
0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:88
    >  #8 in rtl::ToStringHelper<rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 
0>, rtl::OUString, 0>>::operator()(char16_t*, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 
0>, rtl::OUString, 0> const&) const at include/rtl/stringconcat.hxx:207:101
    >  #9 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 
0>, rtl::OUString, 0>, char const [4], 0>::addData(char16_t*) const at 
include/rtl/stringconcat.hxx:195:88
    >  #10 in rtl::ToStringHelper<rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const 
[4], 0>>::operator()(char16_t*, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const 
[4], 0> const&) const at include/rtl/stringconcat.hxx:207:101
    >  #11 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const 
[4], 0>, rtl::OUStringBuffer, 0>::addData(char16_t*) const at 
include/rtl/stringconcat.hxx:195:88
    >  #12 in rtl::OUStringBuffer& 
rtl::OUStringBuffer::operator=<rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 
0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const 
[4], 0>, rtl::OUStringBuffer>(rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, 
rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], 
rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 
0>, rtl::OUString, 0>, char const [4], 0>, rtl::OUStringBuffer, 0>&&) at 
include/rtl/ustrbuf.hxx:378:17
    >  #13 in DoubleCurrencyField::UpdateCurrencyFormat() at 
vcl/source/control/fmtfield.cxx:1120:20
    
    and e.g.
    
    >         OUStringBuffer b("a");
    >         b = "b" + b;
    >         CPPUNIT_ASSERT_EQUAL(OUString("ba"), b.makeStringAndClear());
    
    would indeed easily fail with
    
    > equality assertion failed
    > - Expected: ba
    > - Actual  : bb
    
    Change-Id: I3108c18b7c941953a73b5731d9973914b7ba1fbe
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152495
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/vcl/source/control/fmtfield.cxx b/vcl/source/control/fmtfield.cxx
index de5713261e83..69497dec2c1b 100644
--- a/vcl/source/control/fmtfield.cxx
+++ b/vcl/source/control/fmtfield.cxx
@@ -1117,7 +1117,7 @@ void DoubleCurrencyField::UpdateCurrencyFormat()
         OUString sSymbol = getCurrencySymbol();
         sSymbol = comphelper::string::strip(sSymbol, ' ');
 
-        sNewFormat =
+        OUString sTemp =
             "[$" + sSymbol + "] "
             + sNewFormat
         // for negative values : $ -0.00, not -$ 0.00...
@@ -1128,6 +1128,8 @@ void DoubleCurrencyField::UpdateCurrencyFormat()
             + sSymbol
             + "] -"
             + sNewFormat;
+
+        sNewFormat = sTemp;
     }
     else
     {

Reply via email to