[Libreoffice-commits] core.git: 2 commits - i18npool/inc i18npool/qa i18npool/source svl/source
Eike Rathke
erack at redhat.com
Fri Apr 5 05:53:05 PDT 2013
i18npool/inc/i18npool/lang.h | 1 +
i18npool/inc/i18npool/languagetag.hxx | 6 ++++--
i18npool/qa/cppunit/test_languagetag.cxx | 20 ++++++++++++++++++++
i18npool/source/isolang/isolang.cxx | 1 +
i18npool/source/isolang/mslangid.cxx | 9 +++++----
i18npool/source/languagetag/languagetag.cxx | 9 +++++++--
svl/source/numbers/zforfind.hxx | 4 ++++
7 files changed, 42 insertions(+), 8 deletions(-)
New commits:
commit d526e48912deeb44061ff570d715c31ca45f77b8
Author: Eike Rathke <erack at redhat.com>
Date: Fri Apr 5 14:41:46 2013 +0200
resolved fdo#63161 out of bounds string access
Introduced with c7709b460394283fd5b1d2779b6af3585f80a991
String to OUString where previous String::GetChar() handled this.
Change-Id: I9253df1af7498e2d7a8ea8077ec6b369697ad44e
diff --git a/svl/source/numbers/zforfind.hxx b/svl/source/numbers/zforfind.hxx
index 412e189..dadde5c 100644
--- a/svl/source/numbers/zforfind.hxx
+++ b/svl/source/numbers/zforfind.hxx
@@ -218,6 +218,10 @@ private:
const OUString& rString,
sal_Int32 nPos )
{
+ if (rWhat.isEmpty() || rString.getLength() <= nPos)
+ {
+ return false;
+ }
// mostly used with one character
if ( rWhat[ 0 ] != rString[ nPos ] )
{
commit babbd149aa9b2b5a28c55cb38fbbe24586bf8e22
Author: Eike Rathke <erack at redhat.com>
Date: Thu Apr 4 21:27:53 2013 +0200
added the dreaded jolly joker
Change-Id: I1bd840391496daab2cfe32af6ac00e98de3ed72e
diff --git a/i18npool/inc/i18npool/lang.h b/i18npool/inc/i18npool/lang.h
index e3643fc..81a6d87 100644
--- a/i18npool/inc/i18npool/lang.h
+++ b/i18npool/inc/i18npool/lang.h
@@ -555,6 +555,7 @@ typedef unsigned short LanguageType;
#define LANGUAGE_USER_YOMBE_CONGO 0x8284 /* makeLangID( 0x20, getPrimaryLanguage( LANGUAGE_USER_YOMBE)) */
#define LANGUAGE_USER_SIDAMA 0x0685
+#define LANGUAGE_USER_PRIV_JOKER 0xFFEB /* privateuse "*" (sic! bad! nasty!), primary 0x3eb, sub 0x3f */
#define LANGUAGE_USER_PRIV_COMMENT 0xFFEC /* privateuse "x-comment", primary 0x3ec, sub 0x3f */
#define LANGUAGE_USER_PRIV_DEFAULT 0xFFED /* privateuse "x-default", primary 0x3ed, sub 0x3f */
#define LANGUAGE_USER_PRIV_NOTRANSLATE 0xFFEE /* privateuse "x-no-translate" (sic!), primary 0x3ee, sub 0x3f */
diff --git a/i18npool/inc/i18npool/languagetag.hxx b/i18npool/inc/i18npool/languagetag.hxx
index 0bba7a1..c3d6055 100644
--- a/i18npool/inc/i18npool/languagetag.hxx
+++ b/i18npool/inc/i18npool/languagetag.hxx
@@ -376,7 +376,8 @@ private:
{
EXTRACTED_NONE,
EXTRACTED_LSC,
- EXTRACTED_X
+ EXTRACTED_X,
+ EXTRACTED_X_JOKER
};
/** Of a simple language tag of the form lll[-Ssss][-CC] (i.e. one that
@@ -385,7 +386,8 @@ private:
Does not check case or content!
@return EXTRACTED_LSC if simple tag was detected, EXTRACTED_X if x-...
- privateuse tag was detected, else EXTRACTED_NONE.
+ privateuse tag was detected, EXTRACTED_X_JOKER if "*" joker was
+ detected, else EXTRACTED_NONE.
*/
static Extraction simpleExtract( const OUString& rBcp47,
OUString& rLanguage,
diff --git a/i18npool/qa/cppunit/test_languagetag.cxx b/i18npool/qa/cppunit/test_languagetag.cxx
index 227be20..4e57b39 100644
--- a/i18npool/qa/cppunit/test_languagetag.cxx
+++ b/i18npool/qa/cppunit/test_languagetag.cxx
@@ -232,6 +232,26 @@ void TestLanguageTag::testAllTags()
CPPUNIT_ASSERT( xfoobar.getLanguageType() == LANGUAGE_SYSTEM );
}
+ // '*' the dreaded jolly joker is a "privateuse" known "locale"
+ {
+ OUString s_joker( "*" );
+ LanguageTag joker( s_joker );
+ lang::Locale aLocale = joker.getLocale();
+ CPPUNIT_ASSERT( joker.getBcp47() == s_joker );
+ CPPUNIT_ASSERT( aLocale.Language == "qlt" );
+ CPPUNIT_ASSERT( aLocale.Country == "" );
+ CPPUNIT_ASSERT( aLocale.Variant == "*" );
+ CPPUNIT_ASSERT( joker.getLanguageType() == LANGUAGE_USER_PRIV_JOKER );
+
+ joker.reset( LANGUAGE_USER_PRIV_JOKER );
+ aLocale = joker.getLocale();
+ CPPUNIT_ASSERT( joker.getBcp47() == s_joker );
+ CPPUNIT_ASSERT( aLocale.Language == "qlt" );
+ CPPUNIT_ASSERT( aLocale.Country == "" );
+ CPPUNIT_ASSERT( aLocale.Variant == "*" );
+ CPPUNIT_ASSERT( joker.getLanguageType() == LANGUAGE_USER_PRIV_JOKER );
+ }
+
// test reset() methods
{
LanguageTag aTag( LANGUAGE_DONTKNOW );
diff --git a/i18npool/source/isolang/isolang.cxx b/i18npool/source/isolang/isolang.cxx
index e41d228..17a8033 100644
--- a/i18npool/source/isolang/isolang.cxx
+++ b/i18npool/source/isolang/isolang.cxx
@@ -643,6 +643,7 @@ static IsoLangOtherEntry const aImplPrivateUseEntries[] =
{ LANGUAGE_USER_PRIV_NOTRANSLATE, "x-no-translate" }, //! not BCP47 but legacy in .xcu configmgr
{ LANGUAGE_USER_PRIV_DEFAULT, "x-default" },
{ LANGUAGE_USER_PRIV_COMMENT, "x-comment" },
+ { LANGUAGE_USER_PRIV_JOKER, "*" }, //! not BCP47 but transferable in configmgr
{ LANGUAGE_DONTKNOW, NULL } // marks end of table
};
diff --git a/i18npool/source/isolang/mslangid.cxx b/i18npool/source/isolang/mslangid.cxx
index 6afde62..12cf5a3 100644
--- a/i18npool/source/isolang/mslangid.cxx
+++ b/i18npool/source/isolang/mslangid.cxx
@@ -149,8 +149,8 @@ void MsLangId::Conversion::convertLanguageToLocale( LanguageType nLang,
rLocale.Variant = OUString();
convertLanguageToIsoNames( nLang, rLocale.Language, rLocale.Country);
/* FIXME: this x-... is temporary until conversion will be moved up to
- * LanguageTag */
- if (rLocale.Language.startsWith( "x-"))
+ * LanguageTag. Also handle the nasty "*" joker as privateuse. */
+ if (rLocale.Language.startsWith( "x-") || (rLocale.Language == "*"))
{
rLocale.Variant = rLocale.Language;
rLocale.Language = "qlt";
@@ -186,8 +186,9 @@ LanguageType MsLangId::Conversion::convertLocaleToLanguage(
return LANGUAGE_SYSTEM;
/* FIXME: this x-... is temporary until conversion will be moved up to
- * LanguageTag */
- LanguageType nRet = ((!rLocale.Variant.isEmpty() && rLocale.Variant.startsWithIgnoreAsciiCase( "x-")) ?
+ * LanguageTag. Also handle the nasty "*" joker as privateuse. */
+ LanguageType nRet = ((!rLocale.Variant.isEmpty() &&
+ (rLocale.Variant.startsWithIgnoreAsciiCase( "x-") || (rLocale.Variant == "*"))) ?
convertPrivateUseToLanguage( rLocale.Variant) :
convertIsoNamesToLanguage( rLocale.Language, rLocale.Country));
if (nRet == LANGUAGE_DONTKNOW)
diff --git a/i18npool/source/languagetag/languagetag.cxx b/i18npool/source/languagetag/languagetag.cxx
index 16b81d8..c93943d 100644
--- a/i18npool/source/languagetag/languagetag.cxx
+++ b/i18npool/source/languagetag/languagetag.cxx
@@ -430,7 +430,7 @@ bool LanguageTag::canonicalize()
// locale.
OUString aLanguage, aScript, aCountry;
Extraction eExt = simpleExtract( maBcp47, aLanguage, aScript, aCountry);
- if (eExt == EXTRACTED_LSC || eExt == EXTRACTED_X)
+ if (eExt != EXTRACTED_NONE)
{
if (eExt == EXTRACTED_LSC && aScript.isEmpty())
{
@@ -1160,7 +1160,12 @@ LanguageTag::Extraction LanguageTag::simpleExtract( const OUString& rBcp47,
Extraction eRet = EXTRACTED_NONE;
const sal_Int32 nLen = rBcp47.getLength();
const sal_Int32 nHyph1 = rBcp47.indexOf( '-');
- if (nHyph1 == 1 && rBcp47[0] == 'x') // x-... privateuse
+ if (nLen == 1 && rBcp47[0] == '*') // * the dreaded jolly joker
+ {
+ // It's f*d up but we need to recognize this.
+ eRet = EXTRACTED_X_JOKER;
+ }
+ else if (nHyph1 == 1 && rBcp47[0] == 'x') // x-... privateuse
{
// x-... privateuse tags MUST be known to us by definition.
eRet = EXTRACTED_X;
More information about the Libreoffice-commits
mailing list