rpms/icu/EL-4 icu.icu5431.malayam.patch, NONE, 1.1 icu.icu5433.oriya.patch, NONE, 1.1 icu.icu5465.telegu.patch, NONE, 1.1 icu.icu5488.assamese.patch, NONE, 1.1 icu.icu5500.devicetablecrash.patch, NONE, 1.1 icu.icu5501.sinhala.biggerexpand.patch, NONE, 1.1 icu.icu5506.multiplevowels.patch, NONE, 1.1 icu.icu5557.safety.patch, NONE, 1.1 icu.icu5594.gujarati.patch, NONE, 1.1 icu.icuXXXX.malayalam.bysyllable.patch, NONE, 1.1 icu.icuXXXX.virama.prevnext.patch, NONE, 1.1 icu.regexp.patch, NONE, 1.1 icu.spec, 1.2, 1.3

Thorsten Leemhuis (thl) fedora-extras-commits at redhat.com
Sun Jan 27 13:06:35 UTC 2008


Author: thl

Update of /cvs/pkgs/rpms/icu/EL-4
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv9553

Modified Files:
	icu.spec 
Added Files:
	icu.icu5431.malayam.patch icu.icu5433.oriya.patch 
	icu.icu5465.telegu.patch icu.icu5488.assamese.patch 
	icu.icu5500.devicetablecrash.patch 
	icu.icu5501.sinhala.biggerexpand.patch 
	icu.icu5506.multiplevowels.patch icu.icu5557.safety.patch 
	icu.icu5594.gujarati.patch 
	icu.icuXXXX.malayalam.bysyllable.patch 
	icu.icuXXXX.virama.prevnext.patch icu.regexp.patch 
Log Message:
Sync with F7 3.6-20 (fixes CVE-2007-4770 CVE-2007-4771)

icu.icu5431.malayam.patch:

--- NEW FILE icu.icu5431.malayam.patch ---
--- icu.orig/source/layout/IndicReordering.cpp	2006-12-21 09:24:42.000000000 +0000
+++ icu/source/layout/IndicReordering.cpp	2006-12-21 09:16:15.000000000 +0000
@@ -50,6 +50,14 @@
 #define distFeatureMask 0x00010000UL
 #define initFeatureMask 0x00008000UL
 
+// TODO: Find better names for these!
+#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask)
+#define tagArray3 (pstfFeatureMask | tagArray4)
+#define tagArray2 (halfFeatureMask | tagArray3)
+#define tagArray1 (blwfFeatureMask | tagArray2)
+#define tagArray0 (rphfFeatureMask | tagArray1)
+
+
 class IndicReorderingOutput : public UMemory {
 private:
     le_int32   fOutIndex;
@@ -154,6 +162,27 @@
         fSMabove = fSMbelow = 0;
     }
 
+    void swapChars(int a, int b)
+    {
+	LEErrorCode success = LE_NO_ERROR;
+        LEUnicode temp_char;
+        le_uint32 temp_index;
+        FeatureMask temp_tag;
+
+        temp_char = fOutChars[fOutIndex + b];
+	temp_index = fGlyphStorage.getCharIndex(fOutIndex + b, success);
+        temp_tag = fGlyphStorage.getAuxData(fOutIndex + b, success);
+
+        fOutChars[fOutIndex + b] = fOutChars[fOutIndex + a];
+        le_uint32 toswap = fGlyphStorage.getCharIndex(fOutIndex + a, success);
+        fGlyphStorage.setCharIndex(fOutIndex + b,  toswap, success);
+        fGlyphStorage.setAuxData(fOutIndex + b, tagArray3, success);
+
+        fOutChars[fOutIndex + a] = temp_char;
+        fGlyphStorage.setCharIndex(fOutIndex + a, temp_index, success);
+        fGlyphStorage.setAuxData(fOutIndex + a, temp_tag, success);
+    }
+
     void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures)
     {
         LEErrorCode success = LE_NO_ERROR;
@@ -335,13 +364,6 @@
     C_DOTTED_CIRCLE = 0x25CC
 };
 
-// TODO: Find better names for these!
-#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask)
-#define tagArray3 (pstfFeatureMask | tagArray4)
-#define tagArray2 (halfFeatureMask | tagArray3)
-#define tagArray1 (blwfFeatureMask | tagArray2)
-#define tagArray0 (rphfFeatureMask | tagArray1)
-
 static const FeatureMap featureMap[] =
 {
     {loclFeatureTag, loclFeatureMask},
@@ -629,6 +651,21 @@
                 output.writeChar(chars[i], i, tagArray4);
             }
 
+            /* for the special conjuction of Cons+0x0d4d+0x0d31 or Cons+0x0d4d+0x0d30 of Malayalam */
+            if ((baseConsonant - 2 >= 0) &&
+                (chars[baseConsonant - 1] == 0x0d4d) &&
+		((chars[baseConsonant] == 0x0d31) || 
+		 (chars[baseConsonant] == 0x0d30)) &&
+                ((chars[baseConsonant - 2] >= 0x0d15) &&
+                 (chars[baseConsonant - 2] <= 0x0d39)))  {
+               if (baseConsonant < 3 || chars[baseConsonant - 3] != 0x0d4d) {
+                    output.swapChars(-1, -3);
+
+		    if (mpreFixups)
+		        mpreFixups->reduce();
+		}
+            }
+
             if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) {
                 output.writeMbelow();
                 output.writeSMbelow(); // FIXME: there are no SMs in these scripts...
--- icu.orig/source/layout/MPreFixups.h	2006-11-10 09:42:47.000000000 +0000
+++ icu/source/layout/MPreFixups.h	2006-12-21 09:13:47.000000000 +0000
@@ -31,6 +31,8 @@
     
     void apply(LEGlyphStorage &glyphStorage);
 
+    void reduce();
+
 private:
     FixupData *fFixupData;
     le_int32   fFixupCount;
--- icu.orig/source/layout/MPreFixups.cpp	2006-11-10 09:42:47.000000000 +0000
+++ icu/source/layout/MPreFixups.cpp	2006-12-21 09:16:33.000000000 +0000
@@ -40,6 +40,12 @@
     }
 }
 
+void MPreFixups::reduce()
+{
+    if (fFixupCount > 0)
+        fFixupCount--;
+}
+
 void MPreFixups::apply(LEGlyphStorage &glyphStorage)
 {
     for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {

icu.icu5433.oriya.patch:

--- NEW FILE icu.icu5433.oriya.patch ---
diff -ru icu.orig/source/layout/IndicClassTables.cpp icu/source/layout/IndicClassTables.cpp
--- icu.orig/source/layout/IndicClassTables.cpp	2006-10-03 14:27:47.000000000 +0100
+++ icu/source/layout/IndicClassTables.cpp	2006-10-03 14:30:07.000000000 +0100
@@ -120,6 +120,19 @@
     _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0AE0 - 0AEF
 };
 
+#if 1
+static const IndicClassTable::CharClass oryaCharClasses[] =
+{
+    _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, /* 0B00 - 0B0F */
+    _iv, _xx, _xx, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _ct, _bb, /* 0B10 - 0B1F */
+    _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _pb, /* 0B20 - 0B2F */
+    _rb, _xx, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _nu, _xx, _dr, _da, /* 0B30 - 0B3F */
+    _dr, _db, _db, _db, _xx, _xx, _xx, _dl, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, /* 0B40 - 0B4F */
+    _xx, _xx, _xx, _xx, _xx, _xx, _da, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _pb, /* 0B50 - 0B5F */
+    _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0B60 - 0B6F */
+    _xx, _bb                                                                        /* 0B70 - 0B71 */
+};
+#else
 static const IndicClassTable::CharClass oryaCharClasses[] =
 {
     _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0B00 - 0B0F
@@ -131,6 +144,7 @@
     _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0B60 - 0B6F
     _xx, _ct                                                                        // 0B70 - 0B71
 };
+#endif
 
 static const IndicClassTable::CharClass tamlCharClasses[] =
 {

icu.icu5465.telegu.patch:

--- NEW FILE icu.icu5465.telegu.patch ---
--- icu.orig/source/layout/IndicClassTables.cpp	2007-02-05 14:44:17.000000000 +0000
+++ icu/source/layout/IndicClassTables.cpp	2007-02-05 14:47:49.000000000 +0000
@@ -145,6 +145,7 @@
 };
 
 // FIXME: Should some of the bb's be pb's? (KA, NA, MA, YA, VA, etc. (approx 13))
+#if 0
 static const IndicClassTable::CharClass teluCharClasses[] =
 {
     _xx, _mp, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C00 - 0C0F
@@ -155,6 +156,18 @@
     _xx, _xx, _xx, _xx, _xx, _da, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F
     _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0C60 - 0C6F
 };
+#else
+static const IndicClassTable::CharClass teluCharClasses[] =
+{   
+    _xx, _mp, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, /* 0C00 - 0C0F */
+    _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, /* 0C10 - 0C1F */
+    _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, /* 0C20 - 0C2F */
+    _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, /* 0C30 - 0C3F */
+    _da, _dr, _dr, _dr, _dr, _xx, _da, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, /* 0C40 - 0C4F */
+    _xx, _xx, _xx, _xx, _xx, _da, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0C50 - 0C5F */
+    _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  /* 0C60 - 0C6F */
+};
+#endif
 
 // U+CC3 and U+CC4 are _lm here not _dr since the Kannada rendering
 // rules want them below and to the right of the entire cluster

icu.icu5488.assamese.patch:

--- NEW FILE icu.icu5488.assamese.patch ---
--- icu.orig/source/layout/IndicClassTables.cpp	2006-10-18 09:05:20.000000000 +0100
+++ icu/source/layout/IndicClassTables.cpp	2006-11-01 09:26:58.000000000 +0000
@@ -94,7 +94,7 @@
     _dr, _db, _db, _db, _db, _xx, _xx, _l1, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF
     _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF
     _iv, _iv, _dv, _dv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 09E0 - 09EF
-    _ct, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx                           // 09F0 - 09FA
+    _rv, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx                           /* 09F0 - 09FA */
 };
 
 static const IndicClassTable::CharClass punjCharClasses[] =

icu.icu5500.devicetablecrash.patch:

--- NEW FILE icu.icu5500.devicetablecrash.patch ---
--- icu.orig/source/layout/DeviceTables.cpp	2006-10-18 09:05:20.000000000 +0100
+++ icu/source/layout/DeviceTables.cpp	2006-11-08 09:08:09.000000000 +0000
@@ -22,7 +22,7 @@
     le_uint16 format = SWAPW(deltaFormat) - 1;
     le_int16 result = 0;
     
-    if (ppem >= start && ppem <= SWAPW(endSize)) {
+    if (ppem >= start && ppem <= SWAPW(endSize) && format < sizeof(fieldBits)/sizeof(fieldBits[0])) {
         le_uint16 sizeIndex = ppem - start;
         le_uint16 bits = fieldBits[format];
         le_uint16 count = 16 / bits;

icu.icu5501.sinhala.biggerexpand.patch:

--- NEW FILE icu.icu5501.sinhala.biggerexpand.patch ---
--- icu.orig/source/layout/IndicClassTables.cpp	2006-10-18 09:05:20.000000000 +0100
+++ icu/source/layout/IndicClassTables.cpp	2006-11-08 11:20:55.000000000 +0000
@@ -284,7 +284,7 @@
 
 static const IndicClassTable mlymClassTable = {0x0D00, 0x0D6F, 3, MLYM_SCRIPT_FLAGS, mlymCharClasses, mlymSplitTable};
 
-static const IndicClassTable sinhClassTable = {0x0D80, 0x0DF4, 3, SINH_SCRIPT_FLAGS, sinhCharClasses, sinhSplitTable};
+static const IndicClassTable sinhClassTable = {0x0D80, 0x0DF4, 4, SINH_SCRIPT_FLAGS, sinhCharClasses, sinhSplitTable};
 
 //
 // IndicClassTable addresses

icu.icu5506.multiplevowels.patch:

--- NEW FILE icu.icu5506.multiplevowels.patch ---
diff -ur icu.orig/source/layout/IndicReordering.cpp icu/source/layout/IndicReordering.cpp
--- icu.orig/source/layout/IndicReordering.cpp	2006-11-10 09:42:44.000000000 +0000
+++ icu/source/layout/IndicReordering.cpp	2006-11-10 09:47:05.000000000 +0000
@@ -395,7 +395,7 @@
     {-1,  6,  1, -1, -1, -1, -1, -1, -1,  5,  9,  5,  5,  4, 12}, //  2 - consonant with nukta
     {-1,  6,  1, -1, -1, -1, -1, -1,  2,  5,  9,  5,  5,  4, 12}, //  3 - consonant
     {-1, -1, -1, -1, -1, -1,  3,  2, -1, -1, -1, -1, -1, -1,  7}, //  4 - consonant virama
-    {-1,  6,  1, -1, -1, -1, -1, -1, -1,  5, -1, -1, -1, -1, -1}, //  5 - dependent vowels
+    {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  5 - dependent vowels
     {-1, -1,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //  6 - vowel mark
     {-1, -1, -1, -1, -1, -1,  3,  2, -1, -1, -1, -1, -1, -1, -1}, //  7 - consonant virama ZWJ, consonant ZWJ virama
     {-1,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  4, -1}, //  8 - independent vowels that can take a virama
@@ -423,6 +423,48 @@
 
         state = stateTable[state][charClass & CF_CLASS_MASK];
 
+	/*for the components of split matra*/	
+	if ((charCount >= cursor + 3) &&
+	    (chars[cursor] == 0x0DD9 && chars[cursor + 1] == 0x0DCF && chars[cursor + 2] == 0x0DCA)) {  /*for 3 split matra of Sinhala*/
+	    return cursor + 3;
+	}        
+	else if ((charCount >= cursor + 3) &&
+	         (chars[cursor] == 0x0CC6 && chars[cursor + 1] == 0x0CC2 && chars[cursor + 2] == 0x0CD5)) {  /*for 3 split matra of Kannada*/
+	    return cursor + 3;
+	}
+        /*for 2 split matra*/	
+	else if (charCount >= cursor + 2) {
+	        /*for Bengali*/
+            if ((chars[cursor] == 0x09C7 && chars[cursor + 1] == 0x09BE) ||	       
+	        (chars[cursor] == 0x09C7 && chars[cursor + 1] == 0x09D7) ||		
+	        /*for Oriya*/
+	        (chars[cursor] == 0x0B47 && chars[cursor + 1] == 0x0B3E) ||		
+	        (chars[cursor] == 0x0B47 && chars[cursor + 1] == 0x0B56) ||		
+	        (chars[cursor] == 0x0B47 && chars[cursor + 1] == 0x0B57) ||
+	        /*for Tamil*/
+	        (chars[cursor] == 0x0BC6 && chars[cursor + 1] == 0x0BBE) ||		
+	        (chars[cursor] == 0x0BC6 && chars[cursor + 1] == 0x0BD7) ||		
+	        (chars[cursor] == 0x0BC7 && chars[cursor + 1] == 0x0BBE) ||		
+	        /*for Malayalam*/
+	        (chars[cursor] == 0x0D46 && chars[cursor + 1] == 0x0D3E) ||	
+	        (chars[cursor] == 0x0D46 && chars[cursor + 1] == 0x0D57) ||		
+	        (chars[cursor] == 0x0D47 && chars[cursor + 1] == 0x0D3E) ||	
+	        /*for Sinhala*/
+	        (chars[cursor] == 0x0DD9 && chars[cursor + 1] == 0x0DCA) ||		
+	        (chars[cursor] == 0x0DD9 && chars[cursor + 1] == 0x0DCF) ||		
+	        (chars[cursor] == 0x0DD9 && chars[cursor + 1] == 0x0DDF) ||		
+	        (chars[cursor] == 0x0DDC && chars[cursor + 1] == 0x0DCA) ||		
+	        /*for Telugu*/
+	        (chars[cursor] == 0x0C46 && chars[cursor + 1] == 0x0C56) ||	
+	        /*for Kannada*/
+	        (chars[cursor] == 0x0CBF && chars[cursor + 1] == 0x0CD5) ||		    
+	        (chars[cursor] == 0x0CC6 && chars[cursor + 1] == 0x0CD5) ||		
+	        (chars[cursor] == 0x0CC6 && chars[cursor + 1] == 0x0CD6) ||		
+	        (chars[cursor] == 0x0CC6 && chars[cursor + 1] == 0x0CC2) ||		
+	        (chars[cursor] == 0x0CCA && chars[cursor + 1] == 0x0CD5))
+		    return cursor + 2;
+	}
+
         if (state < 0) {
             break;
         }

icu.icu5557.safety.patch:

--- NEW FILE icu.icu5557.safety.patch ---
--- icu.orig/source/layout/CoverageTables.cpp	2007-01-09 12:57:41.000000000 +0000
+++ icu/source/layout/CoverageTables.cpp	2007-01-09 12:59:09.000000000 +0000
@@ -44,6 +44,11 @@
     le_uint16 count = SWAPW(glyphCount);
     le_uint8 bit = OpenTypeUtilities::highBit(count);
     le_uint16 power = 1 << bit;
+
+    if (count == 0) {
+        return -1;
+    }
+
     le_uint16 extra = count - power;
     le_uint16 probe = power;
     le_uint16 index = 0;

icu.icu5594.gujarati.patch:

--- NEW FILE icu.icu5594.gujarati.patch ---
--- icu.orig/source/layout/IndicClassTables.cpp	2007-02-09 14:26:04.000000000 +0000
+++ icu/source/layout/IndicClassTables.cpp	2007-02-13 15:41:52.000000000 +0000
@@ -117,7 +117,11 @@
     _rv, _xx, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0AB0 - 0ABF
     _dr, _db, _db, _db, _db, _da, _xx, _da, _da, _dr, _xx, _dr, _dr, _vr, _xx, _xx, // 0AC0 - 0ACF
     _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0AD0 - 0ADF
+#if 1
+    _iv, _xx, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0AE0 - 0AEF
+#else
     _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx  // 0AE0 - 0AEF
+#endif
 };
 
 #if 1

icu.icuXXXX.malayalam.bysyllable.patch:

--- NEW FILE icu.icuXXXX.malayalam.bysyllable.patch ---
diff -ruN icu.orig/source/layout/IndicReordering.h icu/source/layout/IndicReordering.h
--- icu.orig/source/layout/IndicReordering.h	2007-04-27 10:28:22.000000000 +0100
+++ icu/source/layout/IndicReordering.h	2007-04-27 10:39:22.000000000 +0100
@@ -142,6 +142,7 @@
     // do not instantiate
     IndicReordering();
 
+public:
     static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount);
 
 };
diff -ruN icu.orig/source/layout/LayoutEngine.cpp icu/source/layout/LayoutEngine.cpp
--- icu.orig/source/layout/LayoutEngine.cpp	2007-04-27 10:28:22.000000000 +0100
+++ icu/source/layout/LayoutEngine.cpp	2007-04-27 10:39:22.000000000 +0100
@@ -14,6 +14,7 @@
 #include "CanonShaping.h"
 #include "HanLayoutEngine.h"
 #include "HangulLayoutEngine.h"
+#include "MalayalamLayoutEngine.h"
 #include "IndicLayoutEngine.h"
 #include "KhmerLayoutEngine.h"
 #include "ThaiLayoutEngine.h"
@@ -451,11 +452,13 @@
 
     if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) {
         switch (scriptCode) {
+        case mlymScriptCode:
+            result = new MalayalamOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable);
+	    break;
         case bengScriptCode:
         case devaScriptCode:
         case gujrScriptCode:
         case kndaScriptCode:
-        case mlymScriptCode:
         case oryaScriptCode:
         case guruScriptCode:
         case tamlScriptCode:
@@ -512,11 +515,13 @@
             result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable);
         } else {
             switch (scriptCode) {
+            case mlymScriptCode:
+                result = new MalayalamOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags);
+	        break;
             case bengScriptCode:
             case devaScriptCode:
             case gujrScriptCode:
             case kndaScriptCode:
-            case mlymScriptCode:
             case oryaScriptCode:
             case guruScriptCode:
             case tamlScriptCode:
diff -ruN icu.orig/source/layout/LEGlyphStorage.h icu/source/layout/LEGlyphStorage.h
--- icu.orig/source/layout/LEGlyphStorage.h	2007-04-27 10:28:22.000000000 +0100
+++ icu/source/layout/LEGlyphStorage.h	2007-04-27 10:43:54.000000000 +0100
@@ -413,6 +413,8 @@
      */
     void adoptGlyphArray(LEGlyphStorage &from);
 
+    void appendGlyphStorage(LEGlyphStorage &from);
+
     /**
      * Delete the char indices array and replace it with the one
      * in <code>from</code>. Set the char indices array pointer
diff -ruN icu.orig/source/layout/Makefile.in icu/source/layout/Makefile.in
--- icu.orig/source/layout/Makefile.in	2007-04-27 10:28:22.000000000 +0100
+++ icu/source/layout/Makefile.in	2007-04-27 10:39:22.000000000 +0100
@@ -66,6 +66,7 @@
 ArabicLayoutEngine.o \
 GXLayoutEngine.o \
 HanLayoutEngine.o \
+MalayalamLayoutEngine.o \
 IndicLayoutEngine.o \
 LayoutEngine.o \
 ContextualGlyphSubstProc.o \
diff -ruN icu.orig/source/layout/MalayalamLayoutEngine.cpp icu/source/layout/MalayalamLayoutEngine.cpp
--- icu.orig/source/layout/MalayalamLayoutEngine.cpp	1970-01-01 01:00:00.000000000 +0100
+++ icu/source/layout/MalayalamLayoutEngine.cpp	2007-04-27 10:44:26.000000000 +0100
@@ -0,0 +1,121 @@
+
+/*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+
+#include "LETypes.h"
+#include "LayoutEngine.h"
+#include "OpenTypeLayoutEngine.h"
+#include "MalayalamLayoutEngine.h"
+#include "ScriptAndLanguageTags.h"
+
+#include "GlyphSubstitutionTables.h"
+#include "GlyphDefinitionTables.h"
+#include "GlyphPositioningTables.h"
+
+#include "GDEFMarkFilter.h"
+#include "LEGlyphStorage.h"
+
+#include "IndicReordering.h"
+
+#include <stdio.h>
+
+U_NAMESPACE_BEGIN
+
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MalayalamOpenTypeLayoutEngine)
+
+void LEGlyphStorage::appendGlyphStorage(LEGlyphStorage &from)
+{
+    if (fInsertionList) applyInsertions();
+    if (from.fInsertionList) from.applyInsertions();
+
+    if (!from.fGlyphCount)
+        return;
+
+    le_int32 newGlyphCount = fGlyphCount + from.fGlyphCount;
+
+    fGlyphs = (LEGlyphID*)LE_GROW_ARRAY(fGlyphs, newGlyphCount);
+    LE_ARRAY_COPY(fGlyphs+fGlyphCount, from.fGlyphs, from.fGlyphCount);
+
+    le_int32 nLargestIndex = 0;
+    if (fGlyphCount)
+    {
+        for (le_int32 i = 0; i < fGlyphCount; ++i)
+        {
+            if (fCharIndices[i] > nLargestIndex)
+                nLargestIndex = fCharIndices[i];
+        }
+        nLargestIndex+=1;
+    }
+    fCharIndices = (le_int32 *)LE_GROW_ARRAY(fCharIndices, newGlyphCount);
+    for (le_int32 i = 0; i < from.fGlyphCount; ++i)
+        fCharIndices[fGlyphCount+i] = from.fCharIndices[i] + nLargestIndex;
+
+    fAuxData = (le_uint32 *)LE_GROW_ARRAY(fAuxData, newGlyphCount);
+    LE_ARRAY_COPY(fAuxData+fGlyphCount, from.fAuxData, from.fGlyphCount);
+
+    fGlyphCount = newGlyphCount;
+}
+
+le_int32 MalayalamOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+{
+    if (LE_FAILURE(success)) {
+        return 0;
+    }
+
+    glyphStorage.appendGlyphStorage(tempGlyphStorage);
+
+    return glyphStorage.getGlyphCount();
+}
+
+
+le_int32 MalayalamOpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success)
+{
+    if (LE_FAILURE(success)) {
+        return 0;
+    }
+
+    if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) {
+        success = LE_ILLEGAL_ARGUMENT_ERROR;
+        return 0;
+    }
+
+    le_int32 outGlyphCount=0;
+
+    const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(fScriptCode);
+    le_int32 prev = 0;
+    while (prev < count)
+    { 
+        le_int32 outCharCount=0, fakeGlyphCount=0;
+        LEUnicode *outChars = NULL;
+        LEGlyphStorage fakeGlyphStorage;
+
+        le_int32 syllable = IndicReordering::findSyllable(classTable, chars+offset, prev, count);
+        outCharCount = characterProcessing(chars+prev, offset, syllable-prev, max, rightToLeft, outChars, fakeGlyphStorage, success);
+
+        if (LE_FAILURE(success)) {
+            return 0;
+        }
+
+        if (outChars != NULL) {
+            fakeGlyphCount = glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success);
+            LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work...
+        } else {
+            fakeGlyphCount = glyphProcessing(chars+prev, offset, syllable-prev, max, rightToLeft, fakeGlyphStorage, success);
+        }
+
+        if (LE_FAILURE(success)) {
+            return 0;
+        }
+
+        outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success);
+
+        prev = syllable;
+    }
+
+    return outGlyphCount;
+}
+
+U_NAMESPACE_END
diff -ruN icu.orig/source/layout/MalayalamLayoutEngine.h icu/source/layout/MalayalamLayoutEngine.h
--- icu.orig/source/layout/MalayalamLayoutEngine.h	1970-01-01 01:00:00.000000000 +0100
+++ icu/source/layout/MalayalamLayoutEngine.h	2007-04-27 10:39:52.000000000 +0100
@@ -0,0 +1,41 @@
+
+/*
+ *
+ * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ *
+ */
+
+#ifndef __MALAYALAMLAYOUTENGINE_H
+#define __MALAYALAMLAYOUTENGINE_H
+
+#include "IndicLayoutEngine.h"
+
+U_NAMESPACE_BEGIN
+
+class MalayalamOpenTypeLayoutEngine : public IndicOpenTypeLayoutEngine
+{
+public:
+    MalayalamOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+                            le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable) :
+        IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable)
+
+    {}
+
+    MalayalamOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+			      le_int32 typoFlags) :
+        IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags)
+
+    {}
+
+    virtual UClassID getDynamicClassID() const;
+    static UClassID getStaticClassID();
+
+protected:
+    virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+
+    virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success);
+};
+
+U_NAMESPACE_END
+#endif
+

icu.icuXXXX.virama.prevnext.patch:

--- NEW FILE icu.icuXXXX.virama.prevnext.patch ---
diff -ur icu.orig/source/common/rbbi.cpp icu/source/common/rbbi.cpp
--- icu.orig/source/common/rbbi.cpp	2006-10-05 11:54:13.000000000 +0100
+++ icu/source/common/rbbi.cpp	2006-10-05 11:57:31.000000000 +0100
@@ -879,6 +879,22 @@
     RBBI_END        // state machine processing is after end of user text.
 };
 
+#define VIRAMA_SCRIPT(wc)        ((wc) >= 0x0901 && (wc) <= 0x17FF)
+#define VIRAMA(wc) ((wc) == 0x094D || \
+                    (wc) == 0x09CD || \
+                    (wc) == 0x0A4D || \
+                    (wc) == 0x0ACD || \
+                    (wc) == 0x0B4D || \
+                    (wc) == 0x0BCD || \
+                    (wc) == 0x0C4D || \
+                    (wc) == 0x0CCD || \
+                    (wc) == 0x0D4D || \
+                    (wc) == 0x0DCA || \
+                    (wc) == 0x0E3A || \
+                    (wc) == 0x0F84 || \
+                    (wc) == 0x1039 || \
+                    (wc) == 0x17D2 || \
+                    (wc) == 0x200D)
 
 //-----------------------------------------------------------------------------------
 //
@@ -896,6 +911,7 @@
     RBBIRunMode         mode;
     
     RBBIStateTableRow  *row;
+    UChar32             prevchar;
     UChar32             c;
     int32_t             lookaheadStatus = 0;
     int32_t             lookaheadTagIdx = 0;
@@ -919,6 +935,7 @@
     // if we're already at the end of the text, return DONE.
     initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText); 
     result          = initialPosition;
+    prevchar        = 0;
     c               = UTEXT_NEXT32(fText);
     if (fData == NULL || c==U_SENTINEL) {
         return BreakIterator::DONE;
@@ -1001,6 +1018,11 @@
 
         // State Transition - move machine to its next state
         //
+        if (VIRAMA_SCRIPT(c) && VIRAMA(prevchar))
+        {
+                state = START_STATE;
+                row = (RBBIStateTableRow *) (tableData + tableRowLen * state);
+        }
         state = row->fNextState[category];
         row = (RBBIStateTableRow *)
             // (statetable->fTableData + (statetable->fRowLen * state));
@@ -1059,6 +1081,7 @@
         //    the input position.  The next iteration will be processing the
         //    first real input character.
         if (mode == RBBI_RUN) {
+            prevchar = c;
             c = UTEXT_NEXT32(fText);
         } else {
             if (mode == RBBI_START) {
@@ -1107,6 +1130,7 @@
     int16_t             category        = 0;
     RBBIRunMode         mode;
     RBBIStateTableRow  *row;
+    UChar32             prevchar;
     UChar32             c;
     int32_t             lookaheadStatus = 0;
     int32_t             result          = 0;
@@ -1135,6 +1159,7 @@
     //  Set up the starting char.
     initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText);
     result          = initialPosition;
+    prevchar        = 0;
     c               = UTEXT_PREVIOUS32(fText);
 
     //  Set the initial state for the state machine
@@ -1218,6 +1243,11 @@
 
         // State Transition - move machine to its next state
         //
+	if (VIRAMA_SCRIPT(prevchar) && VIRAMA(c))
+        {
+                state = START_STATE;
+                row = (RBBIStateTableRow *) (statetable->fTableData + (statetable->fRowLen * state));
+        }
         state = row->fNextState[category];
         row = (RBBIStateTableRow *)
             (statetable->fTableData + (statetable->fRowLen * state));
@@ -1269,6 +1299,7 @@
         //    the input position.  The next iteration will be processing the
         //    first real input character.
         if (mode == RBBI_RUN) {
+            prevchar = c;
             c = UTEXT_PREVIOUS32(fText);
         } else {            
             if (mode == RBBI_START) {

icu.regexp.patch:

--- NEW FILE icu.regexp.patch ---
diff -ru icu.orig/source/common/uvectr32.cpp icu/source/common/uvectr32.cpp
--- icu.orig/source/common/uvectr32.cpp	2003-08-27 02:01:30.000000000 +0100
+++ icu/source/common/uvectr32.cpp	2008-01-22 08:37:06.000000000 +0000
@@ -1,6 +1,6 @@
 /*
 ******************************************************************************
-* Copyright (C) 1999-2003, International Business Machines Corporation and   *
+* Copyright (C) 1999-2008, International Business Machines Corporation and   *
 * others. All Rights Reserved.                                               *
 ******************************************************************************
 *   Date        Name        Description
@@ -26,6 +26,7 @@
 UVector32::UVector32(UErrorCode &status) :
     count(0),
     capacity(0),
+    maxCapacity(0),
     elements(NULL)
 {
     _init(DEFUALT_CAPACITY, status);
@@ -34,6 +35,7 @@
 UVector32::UVector32(int32_t initialCapacity, UErrorCode &status) :
     count(0),
     capacity(0),
+    maxCapacity(0),
     elements(0)
 {
     _init(initialCapacity, status);
@@ -46,6 +48,9 @@
     if (initialCapacity < 1) {
         initialCapacity = DEFUALT_CAPACITY;
     }
+    if (maxCapacity>0 && maxCapacity<initialCapacity) {
+        initialCapacity = maxCapacity;
+    }
     elements = (int32_t *)uprv_malloc(sizeof(int32_t)*initialCapacity);
     if (elements == 0) {
         status = U_MEMORY_ALLOCATION_ERROR;
@@ -189,21 +194,35 @@
 UBool UVector32::expandCapacity(int32_t minimumCapacity, UErrorCode &status) {
     if (capacity >= minimumCapacity) {
         return TRUE;
-    } else {
-        int32_t newCap = capacity * 2;
-        if (newCap < minimumCapacity) {
-            newCap = minimumCapacity;
-        }
-        int32_t* newElems = (int32_t *)uprv_malloc(sizeof(int32_t)*newCap);
-        if (newElems == 0) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return FALSE;
-        }
-        uprv_memcpy(newElems, elements, sizeof(elements[0]) * count);
-        uprv_free(elements);
-        elements = newElems;
-        capacity = newCap;
-        return TRUE;
+    }
+    if (maxCapacity>0 && minimumCapacity>maxCapacity) {
+        status = U_BUFFER_OVERFLOW_ERROR;
+        return FALSE;
+    }
+    int32_t newCap = capacity * 2;
+    if (newCap < minimumCapacity) {
+        newCap = minimumCapacity;
+    }
+    if (maxCapacity > 0 && newCap > maxCapacity) {
+        newCap = maxCapacity;
+    }
+    int32_t* newElems = (int32_t *)uprv_malloc(sizeof(int32_t)*newCap);
+    if (newElems == 0) {
+        status = U_MEMORY_ALLOCATION_ERROR;
+        return FALSE;
+    }
+    uprv_memcpy(newElems, elements, sizeof(elements[0]) * count);
+    uprv_free(elements);
+    elements = newElems;
+    capacity = newCap;
+    return TRUE;
+}
+
+void UVector32::setMaxCapacity(int32_t limit) {
+    U_ASSERT(limit >= 0);
+    maxCapacity = limit;
+    if (maxCapacity < 0) {
+        maxCapacity = 0;
     }
 }
 
diff -ru icu.orig/source/common/uvectr32.h icu/source/common/uvectr32.h
--- icu.orig/source/common/uvectr32.h	2006-01-18 03:52:04.000000000 +0000
+++ icu/source/common/uvectr32.h	2008-01-22 08:37:07.000000000 +0000
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 1999-2006, International Business Machines
+*   Copyright (C) 1999-2008, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 **********************************************************************
 */
@@ -61,6 +61,8 @@
     int32_t   count;
 
     int32_t   capacity;
+    
+    int32_t   maxCapacity;   // Limit beyond which capacity is not permitted to grow.
 
     int32_t*  elements;
 
@@ -162,6 +164,14 @@
     int32_t *getBuffer() const;
 
     /**
+     * Set the maximum allowed buffer capacity for this vector/stack.
+     * Default with no limit set is unlimited, go until malloc() fails.
+     * A Limit of zero means unlimited capacity.
+     * Units are vector elements (32 bits each), not bytes.
+     */
+    void setMaxCapacity(int32_t limit);
+
+    /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      */
     static UClassID U_EXPORT2 getStaticClassID();
@@ -221,7 +231,9 @@
 }
 
 inline int32_t *UVector32::reserveBlock(int32_t size, UErrorCode &status) {
-    ensureCapacity(count+size, status);
+    if (ensureCapacity(count+size, status) == FALSE) {
+        return NULL;
+    }
     int32_t  *rp = elements+count;
     count += size;
     return rp;
diff -ru icu.orig/source/i18n/regexcmp.cpp icu/source/i18n/regexcmp.cpp
--- icu.orig/source/i18n/regexcmp.cpp	2006-02-02 04:37:14.000000000 +0000
+++ icu/source/i18n/regexcmp.cpp	2008-01-22 08:37:06.000000000 +0000
@@ -1187,14 +1187,17 @@
             // Because capture groups can be forward-referenced by back-references,
             //  we fill the operand with the capture group number.  At the end
             //  of compilation, it will be changed to the variable's location.
-            U_ASSERT(groupNum > 0);
-            int32_t  op;
-            if (fModeFlags & UREGEX_CASE_INSENSITIVE) {
-                op = URX_BUILD(URX_BACKREF_I, groupNum);
+            if (groupNum < 1) { 
+                error(U_REGEX_INVALID_BACK_REF);
             } else {
-                op = URX_BUILD(URX_BACKREF, groupNum);
+                int32_t  op;
+                if (fModeFlags & UREGEX_CASE_INSENSITIVE) {
+                    op = URX_BUILD(URX_BACKREF_I, groupNum);
+                } else {
+                    op = URX_BUILD(URX_BACKREF, groupNum);
+                }
+                fRXPat->fCompiledPat->addElement(op, *fStatus);
             }
-            fRXPat->fCompiledPat->addElement(op, *fStatus);
         }
         break;
 
diff -ru icu.orig/source/i18n/rematch.cpp icu/source/i18n/rematch.cpp
--- icu.orig/source/i18n/rematch.cpp	2005-08-25 19:02:20.000000000 +0100
+++ icu/source/i18n/rematch.cpp	2008-01-22 08:37:44.000000000 +0000
@@ -30,6 +30,15 @@
 
 U_NAMESPACE_BEGIN
 
+// Limit the size of the back track stack, to avoid system failures caused
+//   by heap exhaustion.  Units are in 32 bit words, not bytes.
+// This value puts ICU's limits higher than most other regexp implementations,
+//  which use recursion rather than the heap, and take more storage per
+//  backtrack point.
+// This constant is _temporary_.  Proper API to control the value will added.
+//
+static const int32_t BACKTRACK_STACK_CAPACITY = 8000000;
+
 //-----------------------------------------------------------------------------
 //
 //   Constructor and Destructor
@@ -53,6 +62,8 @@
     }
     if (fStack == NULL || fData == NULL) {
         fDeferredStatus = U_MEMORY_ALLOCATION_ERROR;
+    } else {
+        fStack->setMaxCapacity(BACKTRACK_STACK_CAPACITY);
     }
         
     reset(*RegexStaticSets::gStaticSets->fEmptyString);
@@ -78,6 +89,8 @@
     }
     if (fStack == NULL || fData == NULL) {
         status = U_MEMORY_ALLOCATION_ERROR;
+    } else {
+        fStack->setMaxCapacity(BACKTRACK_STACK_CAPACITY);
     }
     reset(input);
 }
@@ -102,6 +115,8 @@
     }
     if (fStack == NULL || fData == NULL) {
         status = U_MEMORY_ALLOCATION_ERROR;
+    } else {
+        fStack->setMaxCapacity(BACKTRACK_STACK_CAPACITY);
     }
     reset(*RegexStaticSets::gStaticSets->fEmptyString);
 }
@@ -1015,6 +1030,14 @@
 inline REStackFrame *RegexMatcher::StateSave(REStackFrame *fp, int32_t savePatIdx, int32_t frameSize, UErrorCode &status) {
     // push storage for a new frame. 
     int32_t *newFP = fStack->reserveBlock(frameSize, status);
+    if (newFP == NULL) {
+        // Heap allocation error on attempted stack expansion.
+        // We need to return a writable stack frame, so just return the
+        //    previous frame.  The match operation will stop quickly
+        //    becuase of the error status, after which the frame will never
+        //    be looked at again.
+        return fp;
+    }
     fp = (REStackFrame *)(newFP - frameSize);  // in case of realloc of stack.
     
     // New stack frame = copy of old top frame.
@@ -1030,8 +1053,8 @@
     fp->fPatIdx = savePatIdx;
     return (REStackFrame *)newFP;
 }
-    
-            
+
+
 //--------------------------------------------------------------------------------
 //
 //   MatchAt      This is the actual matching engine.
@@ -2262,6 +2285,7 @@
         }
 
         if (U_FAILURE(status)) {
+            isMatch = FALSE;
             break;
         }
     }
diff -ru icu.orig/source/test/intltest/regextst.cpp icu/source/test/intltest/regextst.cpp
--- icu.orig/source/test/intltest/regextst.cpp	2005-07-05 19:39:00.000000000 +0100
+++ icu/source/test/intltest/regextst.cpp	2008-01-22 08:38:21.000000000 +0000
@@ -66,6 +66,10 @@
         case 6: name = "PerlTests";
             if (exec) PerlTests();
             break;
+        case 7: name = "Bug 6149";
+            if (exec) Bug6149();
+            break;
+            
 
 
         default: name = "";
@@ -1637,6 +1641,13 @@
     // UnicodeSet containing a string
     REGEX_ERR("abc[{def}]xyz", 1, 10, U_REGEX_SET_CONTAINS_STRING);
 
+    
+    // Invalid Back Reference \0
+    //    For ICU 3.8 and earlier
+    //    For ICU versions newer than 3.8, \0 introduces an octal escape.
+    //
+    REGEX_ERR("(ab)\\0", 1, 6, U_REGEX_INVALID_BACK_REF);
+
 }
 
 
@@ -2119,6 +2130,26 @@
 }
 
 
+//--------------------------------------------------------------
+//
+//  Bug6149   Verify limits to heap expansion for backtrack stack.
+//             Use this pattern,
+//                 "(a?){1,}"
+//             The zero-length match will repeat forever.
+//                (That this goes into a loop is another bug)
+//
+//---------------------------------------------------------------
+void RegexTest::Bug6149() {
+    UnicodeString pattern("(a?){1,}");
+    UnicodeString s("xyz");
+    uint32_t flags = 0;
+    UErrorCode status = U_ZERO_ERROR;
+    
+    RegexMatcher  matcher(pattern, s, flags, status);
+    UBool result = false;
+    REGEX_ASSERT_FAIL(result=matcher.matches(status), U_BUFFER_OVERFLOW_ERROR);
+    REGEX_ASSERT(result == FALSE);
+ }
 
 #endif  /* !UCONFIG_NO_REGULAR_EXPRESSIONS  */
 
diff -ru icu.orig/source/test/intltest/regextst.h icu/source/test/intltest/regextst.h
--- icu.orig/source/test/intltest/regextst.h	2003-12-03 06:58:28.000000000 +0000
+++ icu/source/test/intltest/regextst.h	2008-01-22 08:37:06.000000000 +0000
@@ -30,6 +30,7 @@
     virtual void Extended();
     virtual void Errors();
     virtual void PerlTests();
+    virtual void Bug6149();
 
     // The following functions are internal to the regexp tests.
     virtual UBool doRegexLMTest(const char *pat, const char *text, UBool looking, UBool match, int line);


Index: icu.spec
===================================================================
RCS file: /cvs/pkgs/rpms/icu/EL-4/icu.spec,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- icu.spec	4 Dec 2006 18:10:58 -0000	1.2
+++ icu.spec	27 Jan 2008 13:05:11 -0000	1.3
@@ -1,19 +1,30 @@
-Name:           icu
-Version:        3.6
-Release: 	4%{dist}
-Summary:        International Components for Unicode
-
-Group:          System Environment/Libraries
-License:        X License
-URL:            http://www.ibm.com/software/globalization/icu/
-Source0:        ftp://ftp.software.ibm.com/software/globalization/icu/icu4c-3_6-src.tgz
-BuildRoot:      %{_tmppath}/%{name}-%{version}-root
-
+Name:      icu
+Version:   3.6
+Release:   4%{dist}.20
+Summary:   International Components for Unicode
+Group:     System Environment/Libraries
+License:   MIT
+URL:       http://www.ibm.com/software/globalization/icu/
+Source0:   ftp://ftp.software.ibm.com/software/globalization/icu/3.6/icu4c-3_6-src.tgz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires:  doxygen, autoconf
-Patch1: icu-3.4-multiarchdevel.patch
-Patch2: icu-config
-Patch3: icu.icu5365.dependantvowels.patch
-Patch4: icu.icu5418.malayam.patch
+
+Patch1:  icu-3.4-multiarchdevel.patch
+Patch2:  icu-config
+Patch3:  icu.icu5365.dependantvowels.patch
+Patch4:  icu.icu5418.malayam.patch
+Patch5:  icu.icu5431.malayam.patch
+Patch6:  icu.icu5433.oriya.patch
+Patch7:  icu.icuXXXX.virama.prevnext.patch
+Patch8:  icu.icu5465.telegu.patch
+Patch9:  icu.icu5488.assamese.patch
+Patch10: icu.icu5500.devicetablecrash.patch
+Patch11: icu.icu5501.sinhala.biggerexpand.patch
+Patch12: icu.icu5557.safety.patch
+Patch13: icu.icu5506.multiplevowels.patch
+Patch14: icu.icu5594.gujarati.patch
+Patch15: icu.icuXXXX.malayalam.bysyllable.patch
+Patch16: icu.regexp.patch
 
 %description
 The International Components for Unicode (ICU) libraries provide
@@ -27,34 +38,45 @@
 sacrificing performance. It offers great flexibility to extend and
 customize the supplied services.
 
-%package     -n lib%{name}
-Summary:        International Components for Unicode - libraries
-Group:          System Environment/Libraries
+%package -n lib%{name}
+Summary: International Components for Unicode - libraries
+Group:   System Environment/Libraries
 
 %description -n lib%{name}
 %{summary}.
 
-%package     -n lib%{name}-devel
-Summary:        Development files for International Components for Unicode
-Group:          Development/Libraries
-Requires:       lib%{name} = %{version}-%{release}
+%package  -n lib%{name}-devel
+Summary:  Development files for International Components for Unicode
+Group:    Development/Libraries
+Requires: lib%{name} = %{version}-%{release}
+Requires: pkgconfig
 
 %description -n lib%{name}-devel
 %{summary}.
 
-%package     -n lib%{name}-doc
-Summary:        Documentation for International Components for Unicode
-Group:          Documentation
+%package -n lib%{name}-doc
+Summary: Documentation for International Components for Unicode
+Group:   Documentation
 
 %description -n lib%{name}-doc
 %{summary}.
 
-
 %prep
 %setup -q -n %{name}
-%patch1 -p1 -b .multiarchdevel
-%patch3 -p1 -b .dependantvowels
-%patch4 -p1 -b .malayam.patch
+%patch1  -p1 -b .multiarchdevel
+%patch3  -p1 -b .dependantvowels
+%patch4  -p1 -b .icu5418.malayam.patch
+%patch5  -p1 -b .icu5431.malayam.patch
+%patch6  -p1 -b .icu5433.oriya.patch
+%patch7  -p1 -b .icuXXXX.virama.prevnext.patch
+%patch8  -p1 -b .icu5465.telegu.patch
+%patch9  -p1 -b .icu5488.assamese.patch
+%patch10 -p1 -b .icu5500.devicetablecrash.patch
+%patch11 -p1 -b .icu5501.sinhala.biggerexpand.patch
+%patch12 -p1 -b .icu5557.safety.patch
+%patch13 -p1 -b .icu5506.multiplevowels.patch
+%patch15 -p1 -b .icuXXXX.malayalam.bysyllable.patch
+%patch16 -p1 -b .regexp.patch
 
 %build
 cd source
@@ -70,7 +92,7 @@
 make -C source install DESTDIR=$RPM_BUILD_ROOT
 make -C source install-doc docdir=__docs
 chmod +x $RPM_BUILD_ROOT%{_libdir}/*.so.*
-cp %{PATCH2} $RPM_BUILD_ROOT%{_bindir}/%{name}-config
+cp -p %{PATCH2} $RPM_BUILD_ROOT%{_bindir}/%{name}-config
 chmod a+x $RPM_BUILD_ROOT%{_bindir}/%{name}-config
 sed -i s/\\\$\(THREADSCXXFLAGS\)// $RPM_BUILD_ROOT/%{_libdir}/pkgconfig/icu.pc
 sed -i s/\\\$\(THREADSCPPFLAGS\)/-D_REENTRANT/ $RPM_BUILD_ROOT/%{_libdir}/pkgconfig/icu.pc
@@ -78,16 +100,13 @@
 %check || :
 make -C source check
 
-
 %clean
 rm -rf $RPM_BUILD_ROOT
 
-
 %post -n lib%{name} -p /sbin/ldconfig
 
 %postun -n lib%{name} -p /sbin/ldconfig
 
-
 %files
 %defattr(-,root,root,-)
 %doc license.html readme.html
@@ -133,8 +152,61 @@
 %defattr(-,root,root,-)
 %doc source/__docs/%{name}/html/*
 
-
 %changelog
+* Sun Jan 26 2008 Thorsten Leemhuis <fedora AT leemhuis DOT info> - 3.6-4.20
+- Sync with F7 3.6-20, but ship as 3.6-4.20 to have a proper updates path 
+  EPEL4 (old icu) -> RHEL5 (is has icu-3.6-5.11 right now)
+
+* Thu Jan 24 2008 Caolan McNamara <caolanm at redhat.com> - 3.6-20
+- CVE-2007-4770 CVE-2007-4771 add icu.regexp.patch
+
+* Mon Apr 30 2007 Caolan McNamara <caolanm at redhat.com> - 3.6-19
+- Resolves: rhbz#220867 Malayalam rendering
+
+* Tue Feb 13 2007 Caolan McNamara <caolanm at redhat.com> - 3.6-18
+- Resolves: rhbz#228457 icu.icu5594.gujarati.patch
+
+* Mon Feb 09 2007 Caolan McNamara <caolanm at redhat.com> - 3.6-17
+- spec cleanups
+
+* Mon Feb 05 2007 Caolan McNamara <caolanm at redhat.com> - 3.6-16
+- Resolves: rhbz#226949 layout telegu like pango
+
+* Fri Jan 19 2007 Caolan McNamara <caolanm at redhat.com> - 3.6-15
+- Resolves: rhbz#214948 icu.icu5506.multiplevowels.patch
+
+* Thu Jan 09 2007 Caolan McNamara <caolanm at redhat.com> - 3.6-14
+- Related: rhbz#216089 add icu.icu5557.safety.patch
+
+* Thu Dec 21 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-13
+- Resolves: rhbz#220433 modify icu.icu5431.malayam.patch
+
+* Fri Nov 10 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-12
+- Resolves: rhbz#214948 icu.icu5506.multiplevowels.patch
+
+* Wed Nov 08 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-11
+- Resolves: rhbz#214555 icu.icu5501.sinhala.biggerexpand.patch
+
+* Wed Nov 08 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-10
+- Resolves: rhbz#214555 icu.icu5500.devicetablecrash.patch
+
+* Thu Oct 18 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-9
+- Resolves: rhbz#213648 extend prev/next to handle ZWJ
+
+* Tue Oct 18 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-8
+- Resolves: rhbz213375 (icu.icu5488.assamese.patch)
+
+* Tue Oct 18 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-7
+- Resolves: rhbz#211258 (icu.icu5465.telegu.patch)
+
+* Thu Oct 05 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-6
+- rh#209391# add icu.icuXXXX.virama.prevnext.patch
+
+* Mon Oct 02 2006 Caolan McNamara <caolanm at redhat.com> - 3.6-5
+- rh#208705# add pkg-config Require for -devel package
+- add icu.icu5431.malayam.patch for rh#208551#/rh#209084#
+- add icu.icu5433.oriya.patch for rh#208559#/rh#209083#
+
 * Sun Oct 01 2006 Jesse Keating <jkeating at redhat.com> - 3.6-4
 - rebuilt for unwind info generation, broken in gcc-4.1.1-21
 




More information about the fedora-extras-commits mailing list