<pre style='margin:0'>
Leonardo Brondani Schenkel (lbschenkel) pushed a commit to branch icu
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/0c47ec4d30dc02c085dd851262cf2fcbbb0b1521">https://github.com/macports/macports-ports/commit/0c47ec4d30dc02c085dd851262cf2fcbbb0b1521</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 0c47ec4d30dc02c085dd851262cf2fcbbb0b1521
</span>Author: Leonardo Brondani Schenkel <lbschenkel@macports.org>
AuthorDate: Mon Apr 23 15:36:11 2018 +0200
<span style='display:block; white-space:pre;color:#404040;'> icu: update to 61.1
</span>---
devel/icu/Portfile | 16 +--
devel/icu/files/CVE-2017-14952.patch | 12 --
devel/icu/files/CVE-2017-7867-CVE-2017-7868.patch | 156 ----------------------
3 files changed, 8 insertions(+), 176 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/icu/Portfile b/devel/icu/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 308b564..a44341b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/icu/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/icu/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -8,7 +8,7 @@ set my_name icu4c
</span> # whenever the library version number changes. Thanks.
# To find dependencies, use:
# port file all | sort -u | xargs grep -El ':icu( |$)' | rev | cut -d / -f 2 | rev | sort -u
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version 58.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version 61.1
</span> # Don't update to 59 or later because they require C++11
categories devel textproc
platforms darwin freebsd
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -29,8 +29,9 @@ master_sites http://download.icu-project.org/files/${my_name}/${version}/
</span> distname ${my_name}-[join [split ${version} .] _]
extract.suffix .tgz
distfiles ${distname}-src${extract.suffix}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums rmd160 df06e7b18a87e383d3762564f2e9a59fd75865f9 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sha256 2b0a4410153a9b20de0e20c7d8b66049a72aef244b53683d0d7521371683da0c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums rmd160 50560a899c9c55eb033f86fb7fc56a3db28f2b87 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 d007f89ae8a2543a53525c74359b65b36412fa84b3349f1400be6dcf409fafef \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 23400587
</span>
worksrcdir ${name}/source
set docdir ${prefix}/share/doc/${name}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,9 +49,10 @@ subport ${name}-docs {
</span> long_description-append Documentation.
use_zip yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>- distfiles ${distname}-docs${extract.suffix}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- checksums rmd160 64c9385c43f994d283a38980c77638dc061bfe84 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sha256 dc17983debc1f23f1bd1ac1ba053f2df5b07858f5af9bd48eeb3b8044c8d3146
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ distfiles ${distname}-docs${extract.suffix}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ checksums rmd160 a820dd95329929acd8030b82698d0116f0e546f9 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 62bb6b1bee62472a1e3a0ee0b58c19b4bd24bed278d328db985075b65851dd2a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 7270472
</span>
extract.dir ${worksrcpath}/doc/html
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -103,8 +105,6 @@ if { ${subport} ne "${name}-docs" } {
</span> }
patchfiles-append patch-config-mh-darwin.diff
<span style='display:block; white-space:pre;background:#ffe0e0;'>- patchfiles-append CVE-2017-7867-CVE-2017-7868.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- patchfiles-append CVE-2017-14952.patch
</span>
# ICU has three mechanisms to aid other projects in building properly
# 1) .pc files for pkg-config
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/icu/files/CVE-2017-14952.patch b/devel/icu/files/CVE-2017-14952.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 7e6abc9..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/icu/files/CVE-2017-14952.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,12 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-14952
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-http://bugs.icu-project.org/trac/changeset/40324
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- i18n/zonemeta.cpp.orig 2016-06-15 18:58:17.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ i18n/zonemeta.cpp 2017-10-24 01:32:39.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -683,7 +683,6 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mzMappings = new UVector(deleteOlsonToMetaMappingEntry, NULL, status);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (U_FAILURE(status)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- delete mzMappings;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- deleteOlsonToMetaMappingEntry(entry);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- uprv_free(entry);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/icu/files/CVE-2017-7867-CVE-2017-7868.patch b/devel/icu/files/CVE-2017-7867-CVE-2017-7868.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 335d4a5..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/icu/files/CVE-2017-7867-CVE-2017-7868.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,156 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-https://nvd.nist.gov/vuln/detail/CVE-2017-7867
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-https://nvd.nist.gov/vuln/detail/CVE-2017-7868
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-http://bugs.icu-project.org/trac/ticket/12888
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-http://bugs.icu-project.org/trac/changeset/39671
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- common/utext.cpp.orig 2016-06-15 13:58:17.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ common/utext.cpp 2017-05-25 21:51:47.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -848,9 +848,16 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // Chunk size.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--// Must be less than 85, because of byte mapping from UChar indexes to native indexes.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--// to two UChars.)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// Worst case there are six UTF-8 bytes per UChar.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// obsolete 6 byte form fd + 5 trails maps to fffd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// obsolete 5 byte form fc + 4 trails maps to fffd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// non-shortest 4 byte forms maps to fffd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// mapToUChars array size must allow for the worst case, 6.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// This could be brought down to 4, by treating fd and fc as pure illegal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- //
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- enum { UTF8_TEXT_CHUNK_SIZE=32 };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+enum { SIZEOF_MAPTOUCHARS=UTF8_TEXT_CHUNK_SIZE*6+6 };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- //
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -890,5 +897,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // one for a supplementary starting in the last normal position,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // and one for an entry for the buffer limit position.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ uint8_t mapToUChars[SIZEOF_MAPTOUCHARS]; // Map native offset from bufNativeStart to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // correspoding offset in filled part of buf.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int32_t align;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1033,4 +1040,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- u8b = (UTF8Buf *)ut->p; // the current buffer
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mapIndex = ix - u8b->toUCharsMapStart;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ U_ASSERT(mapIndex < (int32_t)SIZEOF_MAPTOUCHARS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return TRUE;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1299,4 +1307,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // If index is at the end, there is no character there to look at.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (ix != ut->b) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Note: this function will only move the index back if it is on a trail byte
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // and there is a preceding lead byte and the sequence from the lead
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // through this trail could be part of a valid UTF-8 sequence
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Otherwise the index remains unchanged.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- U8_SET_CP_START(s8, 0, ix);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1312,5 +1324,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- uint8_t *mapToNative = u8b->mapToNative;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- uint8_t *mapToUChars = u8b->mapToUChars;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int32_t toUCharsMapStart = ix - SIZEOF_MAPTOUCHARS + 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // Note that toUCharsMapStart can be negative. Happens when the remaining
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // text from current position to the beginning is less than the buffer size.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // at end of buffer to leave room
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1339,4 +1354,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // Special case ASCII range for speed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- buf[destIx] = (UChar)c;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ U_ASSERT(toUCharsMapStart <= srcIx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1368,4 +1384,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } while (sIx >= srcIx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ U_ASSERT(toUCharsMapStart <= (srcIx+1));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // Set native indexing limit to be the current position.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1542,4 +1559,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- U_ASSERT(index<=ut->chunkNativeLimit);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int32_t mapIndex = index - u8b->toUCharsMapStart;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ U_ASSERT(mapIndex < (int32_t)SIZEOF_MAPTOUCHARS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- U_ASSERT(offset>=0 && offset<=ut->chunkLength);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- test/intltest/utxttest.cpp (revision 39670)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ test/intltest/utxttest.cpp (revision 39671)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -68,4 +68,6 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case 7: name = "Ticket12130";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (exec) Ticket12130(); break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case 8: name = "Ticket12888";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (exec) Ticket12888(); break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- default: name = ""; break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1584,2 +1586,62 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- utext_close(&ut);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// Ticket 12888: bad handling of illegal utf-8 containing many instances of the archaic, now illegal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// six byte utf-8 forms. Original implementation had an assumption that
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// there would be at most three utf-8 bytes per UTF-16 code unit.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// The five and six byte sequences map to a single replacement character.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void UTextTest::Ticket12888() {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ const char *badString =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ UErrorCode status = U_ZERO_ERROR;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ LocalUTextPointer ut(utext_openUTF8(NULL, badString, -1, &status));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ TEST_SUCCESS(status);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ for (;;) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ UChar32 c = utext_next32(ut.getAlias());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (c == U_SENTINEL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int32_t endIdx = utext_getNativeIndex(ut.getAlias());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (endIdx != (int32_t)strlen(badString)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ errln("%s:%d expected=%d, actual=%d", __FILE__, __LINE__, strlen(badString), endIdx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ for (int32_t prevIndex = endIdx; prevIndex>0;) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ UChar32 c = utext_previous32(ut.getAlias());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int32_t currentIndex = utext_getNativeIndex(ut.getAlias());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (c != 0xfffd) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ errln("%s:%d (expected, actual, index) = (%d, %d, %d)\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ __FILE__, __LINE__, 0xfffd, c, currentIndex);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (currentIndex != prevIndex - 6) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ errln("%s:%d: wrong index. Expected, actual = %d, %d",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ __FILE__, __LINE__, prevIndex - 6, currentIndex);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ prevIndex = currentIndex;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- test/intltest/utxttest.h (revision 39670)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ test/intltest/utxttest.h (revision 39671)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -39,4 +39,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void Ticket10983();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void Ticket12130();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ void Ticket12888();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- private:
</span></pre><pre style='margin:0'>
</pre>