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;
 };