core/icu to 59.1-1

This commit is contained in:
Kevin Mihelich 2017-04-29 16:32:59 +00:00
parent 2137db76ca
commit 34a7dc06c2
4 changed files with 4 additions and 421 deletions

View file

@ -6,33 +6,24 @@
# - patch to fix icudata library linking on ARM
pkgname=icu
pkgver=58.2
pkgrel=2
pkgver=59.1
pkgrel=1
pkgdesc="International Components for Unicode library"
arch=(i686 x86_64)
url="http://www.icu-project.org/"
license=('custom:icu')
depends=('gcc-libs>=4.7.1-5' 'sh')
depends=('gcc-libs' 'sh')
#makedepends=('clang')
# no https available
source=(#http://download.icu-project.org/files/${pkgname}4c/${pkgver}/${pkgname}4c-${pkgver/./_}-src.tgz
http://download.icu-project.org/files/${pkgname}4c/${pkgver}/${pkgname}4c-${pkgver//./_}-src.tgz
icu-58.1-iterator-reset.patch
changeset-39671-CVE-2017-7867+7868.patch
icudata-stdlibs.patch)
# upstream offers md5sum checks, only asc file for md5sum check
sha256sums=('2b0a4410153a9b20de0e20c7d8b66049a72aef244b53683d0d7521371683da0c'
'8034928bcff89eca84d8d0f22fa9b6bdba5e0608a984f64fe7afe41b91bbea97'
'cf0c6f946d7336bd46857c52308fd67171918f24fcf19015b5a47a8d2fb8ca0c'
sha256sums=('7132fdaf9379429d004005217f10e00b7d2319d0fea22bdfddef8991c45b75fe'
'13444e40ec8da75a3c4140448b25bdf51887a2691c9afdb0c63134ddd33d915b')
prepare() {
cd icu/source
# http://bugs.icu-project.org/trac/ticket/12827
patch -Np4 -i "${srcdir}"/icu-58.1-iterator-reset.patch
patch -Np4 -i "${srcdir}"/changeset-39671-CVE-2017-7867+7868.patch
patch -p2 -i ${srcdir}/icudata-stdlibs.patch
}

View file

@ -1,155 +0,0 @@
Index: /trunk/icu4c/source/common/utext.cpp
===================================================================
--- /trunk/icu4c/source/common/utext.cpp (revision 39670)
+++ /trunk/icu4c/source/common/utext.cpp (revision 39671)
@@ -848,7 +848,13 @@
// Chunk size.
-// Must be less than 85, because of byte mapping from UChar indexes to native indexes.
-// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes
-// to two UChars.)
+// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes.
+// Worst case there are six UTF-8 bytes per UChar.
+// obsolete 6 byte form fd + 5 trails maps to fffd
+// obsolete 5 byte form fc + 4 trails maps to fffd
+// non-shortest 4 byte forms maps to fffd
+// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit
+// mapToUChars array size must allow for the worst case, 6.
+// This could be brought down to 4, by treating fd and fc as pure illegal,
+// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros.
//
enum { UTF8_TEXT_CHUNK_SIZE=32 };
@@ -890,5 +896,5 @@
// one for a supplementary starting in the last normal position,
// and one for an entry for the buffer limit position.
- uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to
+ uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to
// correspoding offset in filled part of buf.
int32_t align;
@@ -1033,4 +1039,5 @@
u8b = (UTF8Buf *)ut->p; // the current buffer
mapIndex = ix - u8b->toUCharsMapStart;
+ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
return TRUE;
@@ -1299,4 +1306,8 @@
// If index is at the end, there is no character there to look at.
if (ix != ut->b) {
+ // Note: this function will only move the index back if it is on a trail byte
+ // and there is a preceding lead byte and the sequence from the lead
+ // through this trail could be part of a valid UTF-8 sequence
+ // Otherwise the index remains unchanged.
U8_SET_CP_START(s8, 0, ix);
}
@@ -1312,5 +1323,8 @@
uint8_t *mapToNative = u8b->mapToNative;
uint8_t *mapToUChars = u8b->mapToUChars;
- int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1);
+ int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1;
+ // Note that toUCharsMapStart can be negative. Happens when the remaining
+ // text from current position to the beginning is less than the buffer size.
+ // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry.
int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region
// at end of buffer to leave room
@@ -1339,4 +1353,5 @@
// Special case ASCII range for speed.
buf[destIx] = (UChar)c;
+ U_ASSERT(toUCharsMapStart <= srcIx);
mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx;
mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart);
@@ -1368,4 +1383,5 @@
mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx;
} while (sIx >= srcIx);
+ U_ASSERT(toUCharsMapStart <= (srcIx+1));
// Set native indexing limit to be the current position.
@@ -1542,4 +1558,5 @@
U_ASSERT(index<=ut->chunkNativeLimit);
int32_t mapIndex = index - u8b->toUCharsMapStart;
+ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
U_ASSERT(offset>=0 && offset<=ut->chunkLength);
Index: /trunk/icu4c/source/test/intltest/utxttest.cpp
===================================================================
--- /trunk/icu4c/source/test/intltest/utxttest.cpp (revision 39670)
+++ /trunk/icu4c/source/test/intltest/utxttest.cpp (revision 39671)
@@ -68,4 +68,6 @@
case 7: name = "Ticket12130";
if (exec) Ticket12130(); break;
+ case 8: name = "Ticket12888";
+ if (exec) Ticket12888(); break;
default: name = ""; break;
}
@@ -1584,2 +1586,62 @@
utext_close(&ut);
}
+
+// Ticket 12888: bad handling of illegal utf-8 containing many instances of the archaic, now illegal,
+// six byte utf-8 forms. Original implementation had an assumption that
+// there would be at most three utf-8 bytes per UTF-16 code unit.
+// The five and six byte sequences map to a single replacement character.
+
+void UTextTest::Ticket12888() {
+ const char *badString =
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80";
+
+ UErrorCode status = U_ZERO_ERROR;
+ LocalUTextPointer ut(utext_openUTF8(NULL, badString, -1, &status));
+ TEST_SUCCESS(status);
+ for (;;) {
+ UChar32 c = utext_next32(ut.getAlias());
+ if (c == U_SENTINEL) {
+ break;
+ }
+ }
+ int32_t endIdx = utext_getNativeIndex(ut.getAlias());
+ if (endIdx != (int32_t)strlen(badString)) {
+ errln("%s:%d expected=%d, actual=%d", __FILE__, __LINE__, strlen(badString), endIdx);
+ return;
+ }
+
+ for (int32_t prevIndex = endIdx; prevIndex>0;) {
+ UChar32 c = utext_previous32(ut.getAlias());
+ int32_t currentIndex = utext_getNativeIndex(ut.getAlias());
+ if (c != 0xfffd) {
+ errln("%s:%d (expected, actual, index) = (%d, %d, %d)\n",
+ __FILE__, __LINE__, 0xfffd, c, currentIndex);
+ break;
+ }
+ if (currentIndex != prevIndex - 6) {
+ errln("%s:%d: wrong index. Expected, actual = %d, %d",
+ __FILE__, __LINE__, prevIndex - 6, currentIndex);
+ break;
+ }
+ prevIndex = currentIndex;
+ }
+}
Index: /trunk/icu4c/source/test/intltest/utxttest.h
===================================================================
--- /trunk/icu4c/source/test/intltest/utxttest.h (revision 39670)
+++ /trunk/icu4c/source/test/intltest/utxttest.h (revision 39671)
@@ -39,4 +39,5 @@
void Ticket10983();
void Ticket12130();
+ void Ticket12888();
private:

View file

@ -1,124 +0,0 @@
Index: /icu/trunk/source/common/ulist.c
===================================================================
--- /icu/trunk/source/common/ulist.c (revision 39483)
+++ /icu/trunk/source/common/ulist.c (revision 39484)
@@ -30,5 +30,4 @@
int32_t size;
- int32_t currentIndex;
};
@@ -52,5 +51,4 @@
newList->tail = NULL;
newList->size = 0;
- newList->currentIndex = -1;
return newList;
@@ -81,6 +79,7 @@
p->next->previous = p->previous;
}
- list->curr = NULL;
- list->currentIndex = 0;
+ if (p == list->curr) {
+ list->curr = p->next;
+ }
--list->size;
if (p->forceDelete) {
@@ -151,5 +150,4 @@
list->head->previous = newItem;
list->head = newItem;
- list->currentIndex++;
}
@@ -194,5 +192,4 @@
curr = list->curr;
list->curr = curr->next;
- list->currentIndex++;
return curr->data;
@@ -210,5 +207,4 @@
if (list != NULL) {
list->curr = list->head;
- list->currentIndex = 0;
}
}
@@ -273,3 +269,2 @@
return (UList *)(en->context);
}
-
Index: /icu/trunk/source/i18n/ucol_res.cpp
===================================================================
--- /icu/trunk/source/i18n/ucol_res.cpp (revision 39483)
+++ /icu/trunk/source/i18n/ucol_res.cpp (revision 39484)
@@ -681,4 +681,5 @@
}
memcpy(en, &defaultKeywordValues, sizeof(UEnumeration));
+ ulist_resetList(sink.values); // Initialize the iterator.
en->context = sink.values;
sink.values = NULL; // Avoid deletion in the sink destructor.
Index: /icu/trunk/source/test/intltest/apicoll.cpp
===================================================================
--- /icu/trunk/source/test/intltest/apicoll.cpp (revision 39483)
+++ /icu/trunk/source/test/intltest/apicoll.cpp (revision 39484)
@@ -82,14 +82,7 @@
col = Collator::createInstance(Locale::getEnglish(), success);
if (U_FAILURE(success)){
- errcheckln(success, "Default Collator creation failed. - %s", u_errorName(success));
- return;
- }
-
- StringEnumeration* kwEnum = col->getKeywordValuesForLocale("", Locale::getEnglish(),true,success);
- if (U_FAILURE(success)){
- errcheckln(success, "Get Keyword Values for Locale failed. - %s", u_errorName(success));
- return;
- }
- delete kwEnum;
+ errcheckln(success, "English Collator creation failed. - %s", u_errorName(success));
+ return;
+ }
col->getVersion(versionArray);
@@ -230,4 +223,27 @@
delete aFrCol;
delete junk;
+}
+
+void CollationAPITest::TestKeywordValues() {
+ IcuTestErrorCode errorCode(*this, "TestKeywordValues");
+ LocalPointer<Collator> col(Collator::createInstance(Locale::getEnglish(), errorCode));
+ if (errorCode.logIfFailureAndReset("English Collator creation failed")) {
+ return;
+ }
+
+ LocalPointer<StringEnumeration> kwEnum(
+ col->getKeywordValuesForLocale("collation", Locale::getEnglish(), TRUE, errorCode));
+ if (errorCode.logIfFailureAndReset("Get Keyword Values for English Collator failed")) {
+ return;
+ }
+ assertTrue("expect at least one collation tailoring for English", kwEnum->count(errorCode) > 0);
+ const char *kw;
+ UBool hasStandard = FALSE;
+ while ((kw = kwEnum->next(NULL, errorCode)) != NULL) {
+ if (strcmp(kw, "standard") == 0) {
+ hasStandard = TRUE;
+ }
+ }
+ assertTrue("expect at least the 'standard' collation tailoring for English", hasStandard);
}
@@ -2467,4 +2483,5 @@
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestProperty);
+ TESTCASE_AUTO(TestKeywordValues);
TESTCASE_AUTO(TestOperators);
TESTCASE_AUTO(TestDuplicate);
Index: /icu/trunk/source/test/intltest/apicoll.h
===================================================================
--- /icu/trunk/source/test/intltest/apicoll.h (revision 39483)
+++ /icu/trunk/source/test/intltest/apicoll.h (revision 39484)
@@ -36,4 +36,5 @@
*/
void TestProperty(/* char* par */);
+ void TestKeywordValues();
/**

View file

@ -1,129 +0,0 @@
Index: icu/trunk/source/layout/IndicReordering.cpp
===================================================================
--- icu/trunk/source/layout/IndicReordering.cpp (revision 25772)
+++ icu/trunk/source/layout/IndicReordering.cpp (revision 26090)
@@ -126,4 +126,8 @@
FeatureMask fSMFeatures;
+ LEUnicode fPreBaseConsonant;
+ LEUnicode fPreBaseVirama;
+ le_int32 fPBCIndex;
+ FeatureMask fPBCFeatures;
void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass)
@@ -172,5 +176,6 @@
fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0),
- fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0)
+ fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0),
+ fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0)
{
// nothing else to do...
@@ -191,4 +196,6 @@
fVMabove = fVMpost = 0;
fSMabove = fSMbelow = 0;
+
+ fPreBaseConsonant = fPreBaseVirama = 0;
}
@@ -386,4 +393,12 @@
}
+ void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features)
+ {
+ fPBCIndex = index;
+ fPreBaseConsonant = PBConsonant;
+ fPreBaseVirama = PBVirama;
+ fPBCFeatures = features;
+ }
+
void noteBaseConsonant()
{
@@ -465,4 +480,20 @@
}
+ void writePreBaseConsonant()
+ {
+ // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam. However,
+ // it seems that almost none of the fonts for Malayalam are set up to handle this.
+ // So, we're going to force the issue here by using the rakar as defined with RA in most fonts.
+
+ if (fPreBaseConsonant == 0x0d31) { // RRA
+ fPreBaseConsonant = 0x0d30; // RA
+ }
+
+ if (fPreBaseConsonant != 0) {
+ writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures);
+ writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures);
+ }
+ }
+
le_int32 getOutputIndex()
{
@@ -723,4 +754,5 @@
}
+
IndicClassTable::CharClass charClass = CC_RESERVED;
IndicClassTable::CharClass nextClass = CC_RESERVED;
@@ -730,7 +762,9 @@
le_bool seenVattu = FALSE;
le_bool seenBelowBaseForm = FALSE;
+ le_bool seenPreBaseForm = FALSE;
le_bool hasNukta = FALSE;
le_bool hasBelowBaseForm = FALSE;
le_bool hasPostBaseForm = FALSE;
+ le_bool hasPreBaseForm = FALSE;
if (postBase < markStart && classTable->isNukta(chars[postBase])) {
@@ -746,12 +780,20 @@
hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta;
hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta;
+ hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta;
if (IndicClassTable::isConsonant(charClass)) {
if (postBaseLimit == 0 || seenVattu ||
(baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) ||
- !(hasBelowBaseForm || hasPostBaseForm)) {
+ !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) {
break;
}
+ // Note any pre-base consonants
+ if ( baseConsonant == lastConsonant && lastConsonant > 0 &&
+ hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) {
+ output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2);
+ seenPreBaseForm = TRUE;
+
+ }
// consonants with nuktas are never vattus
seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta;
@@ -786,10 +828,12 @@
// write any pre-base consonants
+ output.writePreBaseConsonant();
+
le_bool supressVattu = TRUE;
for (i = baseLimit; i < baseConsonant; i += 1) {
LEUnicode ch = chars[i];
- // Don't put 'blwf' on first consonant.
- FeatureMask features = (i == baseLimit? tagArray2 : tagArray1);
+ // Don't put 'pstf' or 'blwf' on anything before the base consonant.
+ FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask );
charClass = classTable->getCharClass(ch);
@@ -842,5 +886,5 @@
// write below-base consonants
- if (baseConsonant != lastConsonant) {
+ if (baseConsonant != lastConsonant && !seenPreBaseForm) {
for (i = bcSpan + 1; i < postBase; i += 1) {
output.writeChar(chars[i], i, tagArray1);
@@ -872,5 +916,5 @@
// write post-base consonants
// FIXME: does this put the right tags on post-base consonants?
- if (baseConsonant != lastConsonant) {
+ if (baseConsonant != lastConsonant && !seenPreBaseForm) {
if (postBase <= lastConsonant) {
for (i = postBase; i <= lastConsonant; i += 1) {