more langtag length limits
Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com> Change-Id: Ie6a84f836be42e4edc16871d8d4dd12a99046d38 Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/1592 Tested-by: Jenkins CPCI <releng@collaboraoffice.com> (cherry picked from commit cca41c7cfbfb77777fe8a58be53f6f2ba84638ab) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/207068 Tested-by: Jenkins Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
This commit is contained in:
committed by
Julien Nabet
parent
297cf4e138
commit
afc4a48212
@@ -19,6 +19,7 @@
|
||||
#include <i18nlangtag/languagetagicu.hxx>
|
||||
|
||||
#include <rtl/ustring.hxx>
|
||||
#include <rtl/ustrbuf.hxx>
|
||||
|
||||
#include <com/sun/star/lang/Locale.hpp>
|
||||
#include <com/sun/star/i18n/ScriptType.hpp>
|
||||
@@ -37,6 +38,8 @@ public:
|
||||
void testDisplayNames();
|
||||
void testLanguagesWithoutHyphenation();
|
||||
void testLongBcp47ToStackString();
|
||||
void testLongLanguageToStackString();
|
||||
void testLongLanguageCountryToStackString();
|
||||
|
||||
CPPUNIT_TEST_SUITE(TestLanguageTag);
|
||||
CPPUNIT_TEST(testAllTags);
|
||||
@@ -44,6 +47,8 @@ public:
|
||||
CPPUNIT_TEST(testDisplayNames);
|
||||
CPPUNIT_TEST(testLanguagesWithoutHyphenation);
|
||||
CPPUNIT_TEST(testLongBcp47ToStackString);
|
||||
CPPUNIT_TEST(testLongLanguageToStackString);
|
||||
CPPUNIT_TEST(testLongLanguageCountryToStackString);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
};
|
||||
|
||||
@@ -1109,6 +1114,37 @@ void TestLanguageTag::testLongBcp47ToStackString()
|
||||
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aBuf.getLength());
|
||||
}
|
||||
|
||||
OUString makeRepeated(sal_Unicode c, sal_Int32 n)
|
||||
{
|
||||
OUStringBuffer aBuf(n);
|
||||
for (sal_Int32 i = 0; i < n; ++i)
|
||||
aBuf.append(c);
|
||||
return aBuf.makeStringAndClear();
|
||||
}
|
||||
|
||||
void TestLanguageTag::testLongLanguageToStackString()
|
||||
{
|
||||
// A non-qlt locale with an overlong Language field and no Country
|
||||
// must not overflow the StackString64 buffer.
|
||||
lang::Locale aLocale;
|
||||
aLocale.Language = makeRepeated(u'a', 80);
|
||||
StackString64 aBuf;
|
||||
LanguageTag::convertToBcp47(aBuf, aLocale, false);
|
||||
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aBuf.getLength());
|
||||
}
|
||||
|
||||
void TestLanguageTag::testLongLanguageCountryToStackString()
|
||||
{
|
||||
// A non-qlt locale whose Language + "-" + Country exceeds the
|
||||
// StackString64 buffer must not overflow.
|
||||
lang::Locale aLocale;
|
||||
aLocale.Language = makeRepeated(u'a', 40);
|
||||
aLocale.Country = makeRepeated(u'B', 40);
|
||||
StackString64 aBuf;
|
||||
LanguageTag::convertToBcp47(aBuf, aLocale, false);
|
||||
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aBuf.getLength());
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( TestLanguageTag );
|
||||
|
||||
}
|
||||
|
||||
@@ -2892,6 +2892,7 @@ static void appendAscii(StackString64& rBuf, const OUString& s)
|
||||
// static
|
||||
void LanguageTagImpl::convertToBcp47( StackString64& rBuf, const css::lang::Locale& rLocale )
|
||||
{
|
||||
assert(rBuf.getLength() == 0);
|
||||
if (rLocale.Language.isEmpty())
|
||||
{
|
||||
// aBcp47 stays empty
|
||||
@@ -2907,8 +2908,11 @@ void LanguageTagImpl::convertToBcp47( StackString64& rBuf, const css::lang::Loca
|
||||
* now just concatenate language and country. In case we stumbled over
|
||||
* variant aware code we'd have to take care of that. */
|
||||
if (rLocale.Country.isEmpty())
|
||||
{
|
||||
if (rLocale.Language.getLength() < 64)
|
||||
appendAscii(rBuf, rLocale.Language);
|
||||
else
|
||||
}
|
||||
else if (rLocale.Language.getLength() + 1 + rLocale.Country.getLength() < 64)
|
||||
{
|
||||
appendAscii(rBuf, rLocale.Language);
|
||||
rBuf.append("-");
|
||||
|
||||
Reference in New Issue
Block a user