   {
       for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {
 *** misc/icu/source/layout/MPreFixups.h	Mon Apr 12 20:51:32 2004
+<<<<<<< icu-3.6.patch
 --- misc/build/icu/source/layout/MPreFixups.h	Tue Nov 13 13:03:52 2007
+=======
+--- misc/build/icu/source/layout/MPreFixups.h	Mon Jan 28 21:31:51 2008
+>>>>>>> 1.10.12.2
 ***************
 *** 31,36 ****
 --- 31,38 ----

*** misc/icu/source/common/putil.c	Mon Jul 31 20:14:28 2006
--- misc/build/icu/source/common/putil.c	Tue Nov 13 13:03:51 2007
***************
*** 48,54 ****
  #endif

  else
  	@echo "$@" > $@
  endif
*** misc/icu/source/i18n/regexcmp.cpp	Thu Feb  2 05:37:14 2006
--- misc/build/icu/source/i18n/regexcmp.cpp	Mon Jan 28 21:31:51 2008
***************
*** 2,8 ****
  //
  //  file:  regexcmp.cpp
  //
! //  Copyright (C) 2002-2006 International Business Machines Corporation and others.
  //  All Rights Reserved.
  //
  //  This file contains the ICU regular expression compiler, which is responsible
--- 2,8 ----
  //
  //  file:  regexcmp.cpp
  //
! //  Copyright (C) 2002-2008 International Business Machines Corporation and others.
  //  All Rights Reserved.
  //
  //  This file contains the ICU regular expression compiler, which is responsible
***************
*** 1187,1200 ****
              // 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);
              } else {
!                 op = URX_BUILD(URX_BACKREF, groupNum);
              }
-             fRXPat->fCompiledPat->addElement(op, *fStatus);
          }
          break;
  
--- 1187,1203 ----
              // 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.
!             if (groupNum < 1) { 
!                 error(U_REGEX_INVALID_BACK_REF);
              } else {
!                 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);
              }
          }
          break;
  
*** misc/icu/source/i18n/rematch.cpp	Thu Aug 25 20:02:20 2005
--- misc/build/icu/source/i18n/rematch.cpp	Mon Jan 28 21:31:51 2008
***************
*** 6,12 ****
  //
  /*
  **************************************************************************
! *   Copyright (C) 2002-2005 International Business Machines Corporation  *
  *   and others. All rights reserved.                                     *
  **************************************************************************
  */
--- 6,12 ----
  //
  /*
  **************************************************************************
! *   Copyright (C) 2002-2008 International Business Machines Corporation  *
  *   and others. All rights reserved.                                     *
  **************************************************************************
  */
***************
*** 30,35 ****
--- 30,44 ----
  
  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,60 ****
      }
      if (fStack == NULL || fData == NULL) {
          fDeferredStatus = U_MEMORY_ALLOCATION_ERROR;
      }
-         
      reset(*RegexStaticSets::gStaticSets->fEmptyString);
  }
  
--- 62,70 ----
      }
      if (fStack == NULL || fData == NULL) {
          fDeferredStatus = U_MEMORY_ALLOCATION_ERROR;
+     } else {
+         fStack->setMaxCapacity(BACKTRACK_STACK_CAPACITY);
      }
      reset(*RegexStaticSets::gStaticSets->fEmptyString);
  }
  
***************
*** 78,83 ****
--- 88,95 ----
      }
      if (fStack == NULL || fData == NULL) {
          status = U_MEMORY_ALLOCATION_ERROR;
+     } else {
+         fStack->setMaxCapacity(BACKTRACK_STACK_CAPACITY);
      }
      reset(input);
  }
***************
*** 102,107 ****
--- 114,121 ----
      }
      if (fStack == NULL || fData == NULL) {
          status = U_MEMORY_ALLOCATION_ERROR;
+     } else {
+         fStack->setMaxCapacity(BACKTRACK_STACK_CAPACITY);
      }
      reset(*RegexStaticSets::gStaticSets->fEmptyString);
  }
***************
*** 1015,1020 ****
--- 1029,1042 ----
  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,1037 ****
      fp->fPatIdx = savePatIdx;
      return (REStackFrame *)newFP;
  }
!     
!             
  //--------------------------------------------------------------------------------
  //
  //   MatchAt      This is the actual matching engine.
--- 1052,1059 ----
      fp->fPatIdx = savePatIdx;
      return (REStackFrame *)newFP;
  }
! 
! 
  //--------------------------------------------------------------------------------
  //
  //   MatchAt      This is the actual matching engine.
***************
*** 2262,2267 ****
--- 2284,2290 ----
          }
  
          if (U_FAILURE(status)) {
+             isMatch = FALSE;
              break;
          }
      }
*** misc/icu/source/i18n/windtfmt.cpp	Tue Aug 15 08:48:02 2006
<<<<<<< icu-3.6.patch
--- misc/build/icu/source/i18n/windtfmt.cpp	Tue Nov 13 13:03:52 2007
=======
--- misc/build/icu/source/i18n/windtfmt.cpp	Mon Jan 28 21:31:51 2008
>>>>>>> 1.10.12.2
***************
*** 232,249 ****
      UChar stackBuffer[STACK_BUFFER_SIZE];
