sal/rtl/strbuf.cxx | 18 +++++++++++++----- sal/rtl/strimp.hxx | 7 ++++++- sal/rtl/strtmpl.cxx | 2 +- sal/rtl/ustrbuf.cxx | 19 +++++++++++++------ 4 files changed, 33 insertions(+), 13 deletions(-)
New commits: commit dead246b1955a99b66b0a69e8da3db1a61f3ab88 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sun Jul 29 15:20:46 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Jul 30 10:18:13 2018 +0200 avoid writing StringBuffer twice Change-Id: Ib0a8914cc1967f89a2cd3b062e7a0b52de7a972c Reviewed-on: https://gerrit.libreoffice.org/58281 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sal/rtl/strbuf.cxx b/sal/rtl/strbuf.cxx index 194e9b159af5..2b7d8e96a8d1 100644 --- a/sal/rtl/strbuf.cxx +++ b/sal/rtl/strbuf.cxx @@ -21,6 +21,7 @@ #include <osl/interlck.h> #include <rtl/strbuf.hxx> +#include "strimp.hxx" /************************************************************************* * rtl_stringbuffer_newFromStr_WithLength @@ -37,9 +38,13 @@ void SAL_CALL rtl_stringbuffer_newFromStr_WithLength( rtl_String ** newStr, return; } - rtl_string_new_WithLength( newStr, count + 16 ); + // use raw alloc to avoid overwriting the buffer twice + if ( *newStr) + rtl_string_release( *newStr ); + *newStr = rtl_string_ImplAlloc( count + 16 ); (*newStr)->length = count; memcpy( (*newStr)->buffer, value, count ); + memset( (*newStr)->buffer + count, 0, 16 ); } /************************************************************************* @@ -78,16 +83,19 @@ void SAL_CALL rtl_stringbuffer_ensureCapacity { rtl_String * pTmp = *This; rtl_String * pNew = nullptr; - *capacity = ((*This)->length + 1) * 2; + auto nLength = (*This)->length; + *capacity = (nLength + 1) * 2; if (minimumCapacity > *capacity) /* still lower, set to the minimum capacity */ *capacity = minimumCapacity; - rtl_string_new_WithLength(&pNew, *capacity); - pNew->length = (*This)->length; + // use raw alloc to avoid overwriting the buffer twice + pNew = rtl_string_ImplAlloc( *capacity ); + pNew->length = nLength; *This = pNew; - memcpy( (*This)->buffer, pTmp->buffer, pTmp->length ); + memcpy( (*This)->buffer, pTmp->buffer, nLength ); + memset( (*This)->buffer + nLength, 0, *capacity - nLength ); rtl_string_release( pTmp ); } } diff --git a/sal/rtl/strimp.hxx b/sal/rtl/strimp.hxx index a5767fea6917..b3446db1fdb2 100644 --- a/sal/rtl/strimp.hxx +++ b/sal/rtl/strimp.hxx @@ -25,8 +25,9 @@ #include <sys/sdt.h> #endif - #include <sal/types.h> +#include <rtl/string.hxx> +#include <rtl/ustring.hxx> /* ======================================================================= */ /* Help functions for String and UString */ @@ -49,6 +50,10 @@ sal_Int16 rtl_ImplGetDigit( sal_Unicode ch, sal_Int16 nRadix ); bool rtl_ImplIsWhitespace( sal_Unicode c ); +rtl_uString* rtl_uString_ImplAlloc( sal_Int32 nLen ); + +rtl_String* rtl_string_ImplAlloc( sal_Int32 nLen ); + extern "C" { typedef void *(*rtl_allocateStringFn)(sal_Size size); diff --git a/sal/rtl/strtmpl.cxx b/sal/rtl/strtmpl.cxx index 341a84d01052..e1ab1dce278c 100644 --- a/sal/rtl/strtmpl.cxx +++ b/sal/rtl/strtmpl.cxx @@ -1134,7 +1134,7 @@ sal_uInt64 SAL_CALL IMPL_RTL_STRNAME( toUInt64 )( const IMPL_RTL_STRCODE* pStr, /* Internal String-Class help functions */ /* ======================================================================= */ -static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen ) +IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen ) { IMPL_RTL_STRINGDATA * pData = (sal::static_int_cast< sal_uInt32 >(nLen) diff --git a/sal/rtl/ustrbuf.cxx b/sal/rtl/ustrbuf.cxx index 4ebfbbbc994c..df8250e71a1d 100644 --- a/sal/rtl/ustrbuf.cxx +++ b/sal/rtl/ustrbuf.cxx @@ -41,9 +41,13 @@ void SAL_CALL rtl_uStringbuffer_newFromStr_WithLength( rtl_uString ** newStr, return; } - rtl_uString_new_WithLength( newStr, count + 16 ); + // use raw alloc to avoid overwriting the buffer twice + if ( *newStr) + rtl_uString_release( *newStr ); + *newStr = rtl_uString_ImplAlloc( count + 16 ); (*newStr)->length = count; - memcpy( (*newStr)->buffer, value, count * sizeof(sal_Unicode)); + memcpy( (*newStr)->buffer, value, count * sizeof(sal_Unicode) ); + memset( (*newStr)->buffer + count, 0, 16 * sizeof(sal_Unicode) ); RTL_LOG_STRING_NEW( *newStr ); } @@ -103,16 +107,19 @@ void SAL_CALL rtl_uStringbuffer_ensureCapacity { rtl_uString * pTmp = *This; rtl_uString * pNew = nullptr; - *capacity = ((*This)->length + 1) * 2; + auto nLength = (*This)->length; + *capacity = (nLength + 1) * 2; if (minimumCapacity > *capacity) /* still lower, set to the minimum capacity */ *capacity = minimumCapacity; - rtl_uString_new_WithLength(&pNew, *capacity); - pNew->length = (*This)->length; + // use raw alloc to avoid overwriting the buffer twice + pNew = rtl_uString_ImplAlloc( *capacity ); + pNew->length = nLength; *This = pNew; - memcpy( (*This)->buffer, pTmp->buffer, pTmp->length * sizeof(sal_Unicode) ); + memcpy( (*This)->buffer, pTmp->buffer, nLength * sizeof(sal_Unicode) ); + memset( (*This)->buffer + nLength, 0, (*capacity - nLength) * sizeof(sal_Unicode) ); RTL_LOG_STRING_NEW( pTmp ); // with accurate contents rtl_uString_release( pTmp ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits