Date: Monday, April 24, 2017 @ 11:46:52 Author: andyrtr Revision: 294284
upgpkg: icu 59.1-1 upstream update 59.1 Modified: icu/trunk/PKGBUILD Deleted: icu/trunk/changeset-39671-CVE-2017-7867+7868.patch icu/trunk/icu-58.1-iterator-reset.patch icu/trunk/icu.8198.revert.icu5431.patch ------------------------------------------+ PKGBUILD | 26 +--- changeset-39671-CVE-2017-7867+7868.patch | 155 ----------------------------- icu-58.1-iterator-reset.patch | 124 ----------------------- icu.8198.revert.icu5431.patch | 129 ------------------------ 4 files changed, 6 insertions(+), 428 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2017-04-24 11:37:14 UTC (rev 294283) +++ PKGBUILD 2017-04-24 11:46:52 UTC (rev 294284) @@ -3,35 +3,21 @@ # Contributor: Art Gramlich <[email protected]> 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) + http://download.icu-project.org/files/${pkgname}4c/${pkgver}/${pkgname}4c-${pkgver//./_}-src.tgz) # upstream offers md5sum checks, only asc file for md5sum check -md5sums=('fac212b32b7ec7ab007a12dff1f3aea1' - '8c09ae284967def053e9579d64d0f83c' - 'cea722333992ad6ede88ebd0bd21cfcd') -sha256sums=('2b0a4410153a9b20de0e20c7d8b66049a72aef244b53683d0d7521371683da0c' - '8034928bcff89eca84d8d0f22fa9b6bdba5e0608a984f64fe7afe41b91bbea97' - 'cf0c6f946d7336bd46857c52308fd67171918f24fcf19015b5a47a8d2fb8ca0c') +md5sums=('54923fa9fab5b2b83f235fb72523de37') +sha256sums=('7132fdaf9379429d004005217f10e00b7d2319d0fea22bdfddef8991c45b75fe') -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 -} - build() { cd icu/source ./configure --prefix=/usr \ Deleted: changeset-39671-CVE-2017-7867+7868.patch =================================================================== --- changeset-39671-CVE-2017-7867+7868.patch 2017-04-24 11:37:14 UTC (rev 294283) +++ changeset-39671-CVE-2017-7867+7868.patch 2017-04-24 11:46:52 UTC (rev 294284) @@ -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: Deleted: icu-58.1-iterator-reset.patch =================================================================== --- icu-58.1-iterator-reset.patch 2017-04-24 11:37:14 UTC (rev 294283) +++ icu-58.1-iterator-reset.patch 2017-04-24 11:46:52 UTC (rev 294284) @@ -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(); - - /** Deleted: icu.8198.revert.icu5431.patch =================================================================== --- icu.8198.revert.icu5431.patch 2017-04-24 11:37:14 UTC (rev 294283) +++ icu.8198.revert.icu5431.patch 2017-04-24 11:46:52 UTC (rev 294284) @@ -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) {
