Index: patches/bidi.patch |
diff --git a/patches/bidi.patch b/patches/bidi.patch |
index 5a43e4cee81e22fe15b36a24d7e9c37a271666a6..41764f07b125478976957bf6a9cfa6ac9b75aca0 100644 |
--- a/patches/bidi.patch |
+++ b/patches/bidi.patch |
@@ -1,95 +1,38 @@ |
-Index: source/test/cintltst/cbiditst.c |
-=================================================================== |
---- source/test/cintltst/cbiditst.c (revision 36303) |
-+++ source/test/cintltst/cbiditst.c (revision 36304) |
-@@ -87,6 +87,8 @@ |
- |
- static void doTailTest(void); |
- |
-+static void testBracketOverflow(void); |
-+ |
- /* new BIDI API */ |
- static void testReorderingMode(void); |
- static void testReorderRunsOnly(void); |
-@@ -133,6 +135,7 @@ |
- addTest(root, testClassOverride, "complex/bidi/TestClassOverride"); |
- addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection"); |
- addTest(root, testContext, "complex/bidi/testContext"); |
-+ addTest(root, testBracketOverflow, "complex/bidi/TestBracketOverflow"); |
- |
- addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest"); |
- addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef"); |
-@@ -4896,3 +4899,25 @@ |
- |
- log_verbose("\nExiting TestContext \n\n"); |
- } |
-+ |
-+/* Ticket#11054 ubidi_setPara crash with heavily nested brackets */ |
-+static void |
-+testBracketOverflow(void) { |
-+ static const char* TEXT = "(((((((((((((((((((((((((((((((((((((((((a)(A)))))))))))))))))))))))))))))))))))))))))"; |
-+ UErrorCode status = U_ZERO_ERROR; |
-+ UBiDi* bidi; |
-+ UChar src[100]; |
-+ UChar dest[100]; |
-+ int32_t len; |
-+ |
-+ bidi = ubidi_open(); |
-+ len = uprv_strlen(TEXT); |
-+ pseudoToU16(len, TEXT, src); |
-+ ubidi_setPara(bidi, src, len, UBIDI_DEFAULT_LTR , NULL, &status); |
-+ if (U_FAILURE(status)) { |
-+ log_err("setPara failed with heavily nested brackets - %s", u_errorName(status)); |
-+ } |
-+ |
-+ ubidi_close(bidi); |
-+} |
-+ |
-Index: source/common/ubidiimp.h |
-=================================================================== |
---- source/common/ubidiimp.h (revision 36303) |
-+++ source/common/ubidiimp.h (revision 36304) |
-@@ -173,7 +173,7 @@ |
- /* array of opening entries which should be enough in most cases; no malloc() */ |
- Opening simpleOpenings[SIMPLE_OPENINGS_SIZE]; |
- Opening *openings; /* pointer to current array of entries */ |
-- int32_t openingsSize; /* number of allocated entries */ |
-+ int32_t openingsCount; /* number of allocated entries */ |
- int32_t isoRunLast; /* index of last used entry */ |
- /* array of nested isolated sequence entries; can never excess UBIDI_MAX_EXPLICIT_LEVEL |
- + 1 for index 0, + 1 for before the first isolated sequence */ |
-Index: source/common/ubidi.c |
-=================================================================== |
---- source/common/ubidi.c (revision 36303) |
-+++ source/common/ubidi.c (revision 36304) |
-@@ -679,10 +679,10 @@ |
- bd->isoRuns[0].contextPos=0; |
- if(pBiDi->openingsMemory) { |
- bd->openings=pBiDi->openingsMemory; |
-- bd->openingsSize=pBiDi->openingsSize; |
-+ bd->openingsCount=pBiDi->openingsSize / sizeof(Opening); |
- } else { |
- bd->openings=bd->simpleOpenings; |
-- bd->openingsSize=SIMPLE_OPENINGS_SIZE; |
-+ bd->openingsCount=SIMPLE_OPENINGS_SIZE; |
+diff --git a/source/common/ubidi.c b/source/common/ubidi.c |
+index 8c0d64b..e773de7 100644 |
+--- a/source/common/ubidi.c |
++++ b/source/common/ubidi.c |
+@@ -1,7 +1,7 @@ |
+ /* |
+ ****************************************************************************** |
+ * |
+-* Copyright (C) 1999-2014, International Business Machines |
++* Copyright (C) 1999-2015, International Business Machines |
+ * Corporation and others. All Rights Reserved. |
+ * |
+ ****************************************************************************** |
+@@ -2340,7 +2340,7 @@ setParaSuccess(UBiDi *pBiDi) { |
+ static void |
+ setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, |
+ UBiDiLevel paraLevel, UErrorCode *pErrorCode) { |
+- void *runsOnlyMemory; |
++ void *runsOnlyMemory = NULL; |
+ int32_t *visualMap; |
+ UChar *visualText; |
+ int32_t saveLength, saveTrailingWSStart; |
+@@ -2514,12 +2514,13 @@ setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, |
} |
- bd->isNumbersSpecial=bd->pBiDi->reorderingMode==UBIDI_REORDER_NUMBERS_SPECIAL || |
- bd->pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL; |
-@@ -743,7 +743,7 @@ |
- bracketAddOpening(BracketData *bd, UChar match, int32_t position) { |
- IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast]; |
- Opening *pOpening; |
-- if(pLastIsoRun->limit>=bd->openingsSize) { /* no available new entry */ |
-+ if(pLastIsoRun->limit>=bd->openingsCount) { /* no available new entry */ |
- UBiDi *pBiDi=bd->pBiDi; |
- if(!getInitialOpeningsMemory(pBiDi, pLastIsoRun->limit * 2)) |
- return FALSE; |
-@@ -751,7 +751,7 @@ |
- uprv_memcpy(pBiDi->openingsMemory, bd->simpleOpenings, |
- SIMPLE_OPENINGS_SIZE * sizeof(Opening)); |
- bd->openings=pBiDi->openingsMemory; /* may have changed */ |
-- bd->openingsSize=pBiDi->openingsSize; |
-+ bd->openingsCount=pBiDi->openingsSize / sizeof(Opening); |
+ uprv_memcpy(pBiDi->levels, saveLevels, saveLength*sizeof(UBiDiLevel)); |
+ pBiDi->trailingWSStart=saveTrailingWSStart; |
+- /* free memory for mapping table and visual text */ |
+- uprv_free(runsOnlyMemory); |
+ if(pBiDi->runCount>1) { |
+ pBiDi->direction=UBIDI_MIXED; |
} |
- pOpening=&bd->openings[pLastIsoRun->limit]; |
- pOpening->position=position; |
+ cleanup3: |
++ /* free memory for mapping table and visual text */ |
++ uprv_free(runsOnlyMemory); |
++ |
+ pBiDi->reorderingMode=UBIDI_REORDER_RUNS_ONLY; |
+ } |
+ |