tdf#83306: sal: fix compare of rtl::OUString/OString containing '\0'
For whatever reason oox shape import code uses OUStrings that contain
'\0' characters.
The rtl_uString / rtl_String are allowed to contain '\0' but the
strncmp/wcsncmp functions stop comparing on the first '\0', so use
memcmp/wmemcmp instead.
(regression from 281989007f
)
Change-Id: If148927f19d065a21f32f3c14433b0bda7ae9301
Reviewed-on: https://gerrit.libreoffice.org/29384
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Stahl <mstahl@redhat.com>
This commit is contained in:
parent
04f571349c
commit
de7ed418e7
1 changed files with 5 additions and 4 deletions
|
@ -127,14 +127,15 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCOD
|
||||||
#if !IMPL_RTL_IS_USTRING
|
#if !IMPL_RTL_IS_USTRING
|
||||||
// take advantage of builtin optimisations
|
// take advantage of builtin optimisations
|
||||||
sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
|
sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
|
||||||
sal_Int32 nRet = strncmp(pStr1, pStr2, nMin);
|
sal_Int32 nRet = memcmp(pStr1, pStr2, nMin);
|
||||||
return nRet == 0 ? nStr1Len - nStr2Len : nRet;
|
return nRet == 0 ? nStr1Len - nStr2Len : nRet;
|
||||||
#else
|
#else
|
||||||
if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
|
if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
|
||||||
{
|
{
|
||||||
// take advantage of builtin optimisations
|
// take advantage of builtin optimisations
|
||||||
sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
|
sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
|
||||||
sal_Int32 nRet = wcsncmp(reinterpret_cast<wchar_t const *>(pStr1), reinterpret_cast<wchar_t const *>(pStr2), nMin);
|
sal_Int32 nRet = wmemcmp(reinterpret_cast<wchar_t const *>(pStr1),
|
||||||
|
reinterpret_cast<wchar_t const *>(pStr2), nMin);
|
||||||
return nRet == 0 ? nStr1Len - nStr2Len : nRet;
|
return nRet == 0 ? nStr1Len - nStr2Len : nRet;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -170,7 +171,7 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_R
|
||||||
#if !IMPL_RTL_IS_USTRING
|
#if !IMPL_RTL_IS_USTRING
|
||||||
// take advantage of builtin optimisations
|
// take advantage of builtin optimisations
|
||||||
sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
|
sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
|
||||||
sal_Int32 nRet = strncmp(pStr1, pStr2, nMin);
|
sal_Int32 nRet = memcmp(pStr1, pStr2, nMin);
|
||||||
if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
|
if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
|
||||||
return nStr1Len - nStr2Len;
|
return nStr1Len - nStr2Len;
|
||||||
return nRet;
|
return nRet;
|
||||||
|
@ -179,7 +180,7 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_R
|
||||||
{
|
{
|
||||||
// take advantage of builtin optimisations
|
// take advantage of builtin optimisations
|
||||||
sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
|
sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
|
||||||
sal_Int32 nRet = wcsncmp(reinterpret_cast<wchar_t const *>(pStr1), reinterpret_cast<wchar_t const *>(pStr2), nMin);
|
sal_Int32 nRet = wmemcmp(reinterpret_cast<wchar_t const *>(pStr1), reinterpret_cast<wchar_t const *>(pStr2), nMin);
|
||||||
if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
|
if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
|
||||||
return nStr1Len - nStr2Len;
|
return nStr1Len - nStr2Len;
|
||||||
return nRet;
|
return nRet;
|
||||||
|
|
Loading…
Reference in a new issue