]> granicus.if.org Git - icu/commitdiff
ICU-8668 C, C++, restrict script to alphabetic in locale name.
authorAbhinav Gupta <mail@abhinavg.net>
Mon, 5 Dec 2011 20:15:15 +0000 (20:15 +0000)
committerAbhinav Gupta <mail@abhinavg.net>
Mon, 5 Dec 2011 20:15:15 +0000 (20:15 +0000)
X-SVN-Rev: 31031

icu4c/source/common/cstring.h
icu4c/source/common/locid.cpp
icu4c/source/common/uloc.cpp
icu4c/source/test/cintltst/cloctst.c
icu4c/source/test/intltest/loctest.cpp

index 811e2d82cf3c0d5b2fd9fdf8b1bcb383d25e1bae..56a57f5d686f5916964e5cb095073922005380a0 100644 (file)
@@ -41,6 +41,8 @@
 #define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
 #define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
 
+#define uprv_isalpha(c) U_STANDARD_CPP_NAMESPACE isalpha(c)
+
 U_CAPI char U_EXPORT2
 uprv_toupper(char c);
 
index e6a97ed2e3ba78d4130e66f6e1ada63913c5e5cf..f2ded6f00b52628b108d9eedf8bc93a484c26471 100644 (file)
@@ -601,14 +601,16 @@ Locale& Locale::init(const char* localeID, UBool canonicalize)
             uprv_memcpy(language, fullName, fieldLen[0]);
             language[fieldLen[0]] = 0;
         }
-        if (fieldLen[1] == 4) {
+        if (fieldLen[1] == 4 && uprv_isalpha(field[1][0]) &&
+                uprv_isalpha(field[1][1]) && uprv_isalpha(field[1][2]) &&
+                uprv_isalpha(field[1][3])) {
             /* We have at least a script */
             uprv_memcpy(script, field[1], fieldLen[1]);
             script[fieldLen[1]] = 0;
             variantField++;
         }
 
-        if (fieldLen[variantField] > 0 && fieldLen[variantField] <= (int32_t)(sizeof(country))) {
+        if (fieldLen[variantField] == 2 || fieldLen[variantField] == 3) {
             /* We have a country */
             uprv_memcpy(country, field[variantField], fieldLen[variantField]);
             country[fieldLen[variantField]] = 0;
index 7d2b1f235c13c4b4fc2bd7b9e9889278c97cf6bc..18f6602826c73a2337dc27b8f290abfdce4eba3c 100644 (file)
@@ -1260,7 +1260,8 @@ ulocimp_getScript(const char *localeID,
     }
 
     /* copy the second item as far as possible and count its length */
-    while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen])) {
+    while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen])
+            && uprv_isalpha(localeID[idLen])) {
         idLen++;
     }
 
index c572fd98fde77c9da5e7569f64422e3bd750abc9..ce77b36f8d1eef4603853277f4bf3498411fa0d7 100644 (file)
@@ -401,6 +401,7 @@ static void TestPrefixes() {
         {"zh", "Hans", "", "PINYIN", "zh-Hans-pinyin", "zh_Hans_PINYIN", "zh_Hans@collation=pinyin"},
         {"hy", "", "", "AREVMDA", "hy_AREVMDA", "hy_AREVMDA", NULL},
         
+        {"de", "", "", "1901", "de-1901", "de_1901", NULL},
         {"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"},
         {"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"},
         {"x-piglatin", "", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML"},  /* Multibyte English */
@@ -415,7 +416,7 @@ static void TestPrefixes() {
         {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", "zh_Hant_TW@collation=stroke"},
         {"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", NULL},
         {"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", NULL},
-        {"12", "3456", "78", "90", "12_3456_78_90", "12_3456_78_90", NULL}, /* total garbage */
+        {"ab", "Cdef", "GH", "IJ", "ab_cdef_gh_ij", "ab_Cdef_GH_IJ", NULL}, /* total garbage */
         
         {NULL,NULL,NULL,NULL,NULL,NULL,NULL}
     };
index de5bbc7c855b35e307eab0cf1e26b4a3680051ab..91e79f8d437d7f1d9395d0299c56a6aec01b6a22 100644 (file)
@@ -2082,6 +2082,10 @@ void LocaleTest::TestVariantWithOutCountry(void) {
     if (0 != strcmp(loc5.getVariant(), "FOUR")) {
         errln("FAIL: _Latn_US_FOUR didn't get parsed correctly - name is %s - expected %s got %s", loc5.getName(), "FOUR", loc5.getVariant());
     }
+    Locale loc6("de-1901");
+    if (0 != strcmp(loc6.getVariant(), "1901")) {
+        errln("FAIL: de-1901 didn't get parsed correctly - name is %s - expected %s got %s", loc6.getName(), "1901", loc6.getVariant());
+    }
 }
 
 static Locale _canonicalize(int32_t selector, /* 0==createFromName, 1==createCanonical, 2==Locale ct */