ICU-8072 Fix crash in genrb coll processing due to stale rulesToParse pointers in UColToken hashtable
X-SVN-Rev: 28898
diff --git a/icu4c/source/i18n/ucol_bld.cpp b/icu4c/source/i18n/ucol_bld.cpp
index ff9abb2..a7f6cf6 100644
--- a/icu4c/source/i18n/ucol_bld.cpp
+++ b/icu4c/source/i18n/ucol_bld.cpp
@@ -853,7 +853,7 @@
//uint32_t exp = currentSequenceLen | expOffset;
UColToken exp;
exp.source = currentSequenceLen | expOffset;
- exp.rulesToParse = src->source;
+ exp.rulesToParseHdl = &(src->source);
while(len > 0) {
currentSequenceLen = len;
diff --git a/icu4c/source/i18n/ucol_tok.cpp b/icu4c/source/i18n/ucol_tok.cpp
index 374a213..365456e 100644
--- a/icu4c/source/i18n/ucol_tok.cpp
+++ b/icu4c/source/i18n/ucol_tok.cpp
@@ -41,12 +41,10 @@
//uint32_t key = (uint32_t)k.integer;
UColToken *key = (UColToken *)k.pointer;
if (key != 0) {
- //int32_t len = (key & 0xFF000000)>>24;
int32_t len = (key->source & 0xFF000000)>>24;
int32_t inc = ((len - 32) / 32) + 1;
- //const UChar *p = (key & 0x00FFFFFF) + rulesToParse;
- const UChar *p = (key->source & 0x00FFFFFF) + key->rulesToParse;
+ const UChar *p = (key->source & 0x00FFFFFF) + *(key->rulesToParseHdl);
const UChar *limit = p + len;
while (p<limit) {
@@ -64,8 +62,8 @@
//uint32_t p2 = (uint32_t) key2.integer;
UColToken *p1 = (UColToken *)key1.pointer;
UColToken *p2 = (UColToken *)key2.pointer;
- const UChar *s1 = (p1->source & 0x00FFFFFF) + p1->rulesToParse;
- const UChar *s2 = (p2->source & 0x00FFFFFF) + p2->rulesToParse;
+ const UChar *s1 = (p1->source & 0x00FFFFFF) + *(p1->rulesToParseHdl);
+ const UChar *s2 = (p2->source & 0x00FFFFFF) + *(p2->rulesToParseHdl);
uint32_t s1L = ((p1->source & 0xFF000000) >> 24);
uint32_t s2L = ((p2->source & 0xFF000000) >> 24);
const UChar *end = s1+s1L-1;
@@ -1344,7 +1342,7 @@
*status = U_MEMORY_ALLOCATION_ERROR;
return NULL;
}
- sourceToken->rulesToParse = src->source;
+ sourceToken->rulesToParseHdl = &(src->source);
sourceToken->source = src->parsedToken.charsLen << 24 | src->parsedToken.charsOffset;
sourceToken->expansion = src->parsedToken.extensionLen << 24 | src->parsedToken.extensionOffset;
@@ -1451,7 +1449,7 @@
src->parsedToken.charsLen++;
key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/;
- key.rulesToParse = src->source;
+ key.rulesToParseHdl = &(src->source);
//sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key);
sourceToken = (UColToken *)uhash_get(src->tailored, &key);
@@ -1530,7 +1528,7 @@
// uint32_t key = (*newCharsLen << 24) | *charsOffset;
key.source = (src->parsedToken.charsLen/**newCharsLen*/ << 24) | src->parsedToken.charsOffset/**charsOffset*/;
- key.rulesToParse = src->source;
+ key.rulesToParseHdl = &(src->source);
//sourceToken = (UColToken *)uhash_iget(src->tailored, (int32_t)key);
sourceToken = (UColToken *)uhash_get(src->tailored, &key);
@@ -1620,7 +1618,7 @@
//key = newCharsLen << 24 | charsOffset;
UColToken key;
key.source = src->parsedToken.charsLen << 24 | src->parsedToken.charsOffset;
- key.rulesToParse = src->source;
+ key.rulesToParseHdl = &(src->source);
/* 4 Lookup each source in the CharsToToken map, and find a sourceToken */
sourceToken = (UColToken *)uhash_get(src->tailored, &key);
@@ -1640,7 +1638,7 @@
*status = U_MEMORY_ALLOCATION_ERROR;
return 0;
}
- sourceToken->rulesToParse = src->source;
+ sourceToken->rulesToParseHdl = &(src->source);
sourceToken->source = src->parsedToken.charsLen << 24 | src->parsedToken.charsOffset;
sourceToken->debugSource = *(src->source + src->parsedToken.charsOffset);
@@ -1820,7 +1818,7 @@
//key = searchCharsLen << 24 | charsOffset;
UColToken key;
key.source = searchCharsLen << 24 | src->parsedToken.charsOffset;
- key.rulesToParse = src->source;
+ key.rulesToParseHdl = &(src->source);
sourceToken = (UColToken *)uhash_get(src->tailored, &key);
}
if(sourceToken != NULL) {
@@ -2067,7 +2065,6 @@
uprv_memcpy(src->opts, UCA->options, sizeof(UColOptionSet));
- // rulesToParse = src->source;
src->lh = 0;
src->listCapacity = 1024;
src->lh = (UColTokListHeader *)uprv_malloc(src->listCapacity*sizeof(UColTokListHeader));
diff --git a/icu4c/source/i18n/ucol_tok.h b/icu4c/source/i18n/ucol_tok.h
index a78e3f4..4e7ea3c 100644
--- a/icu4c/source/i18n/ucol_tok.h
+++ b/icu4c/source/i18n/ucol_tok.h
@@ -82,7 +82,7 @@
UColTokListHeader *listHeader;
UColToken* previous;
UColToken* next;
- UChar *rulesToParse;
+ UChar **rulesToParseHdl;
uint16_t flags;
};