Home | History | Annotate | Download | only in patches
      1 Index: source/test/cintltst/cbiditst.c
      2 ===================================================================
      3 --- source/test/cintltst/cbiditst.c	(revision 36303)
      4 +++ source/test/cintltst/cbiditst.c	(revision 36304)
      5 @@ -87,6 +87,8 @@
      6  
      7  static void doTailTest(void);
      8  
      9 +static void testBracketOverflow(void);
     10 +
     11  /* new BIDI API */
     12  static void testReorderingMode(void);
     13  static void testReorderRunsOnly(void);
     14 @@ -133,6 +135,7 @@
     15      addTest(root, testClassOverride, "complex/bidi/TestClassOverride");
     16      addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection");
     17      addTest(root, testContext, "complex/bidi/testContext");
     18 +    addTest(root, testBracketOverflow, "complex/bidi/TestBracketOverflow");
     19  
     20      addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest");
     21      addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef");
     22 @@ -4896,3 +4899,25 @@
     23  
     24      log_verbose("\nExiting TestContext \n\n");
     25  }
     26 +
     27 +/* Ticket#11054 ubidi_setPara crash with heavily nested brackets */
     28 +static void
     29 +testBracketOverflow(void) {
     30 +    static const char* TEXT = "(((((((((((((((((((((((((((((((((((((((((a)(A)))))))))))))))))))))))))))))))))))))))))";
     31 +    UErrorCode status = U_ZERO_ERROR;
     32 +    UBiDi* bidi;
     33 +    UChar src[100];
     34 +    UChar dest[100];
     35 +    int32_t len;
     36 +
     37 +    bidi = ubidi_open();
     38 +    len = uprv_strlen(TEXT);
     39 +    pseudoToU16(len, TEXT, src);
     40 +    ubidi_setPara(bidi, src, len, UBIDI_DEFAULT_LTR , NULL, &status);
     41 +    if (U_FAILURE(status)) {
     42 +        log_err("setPara failed with heavily nested brackets - %s", u_errorName(status));
     43 +    }
     44 +
     45 +    ubidi_close(bidi);
     46 +}
     47 +
     48 Index: source/common/ubidiimp.h
     49 ===================================================================
     50 --- source/common/ubidiimp.h	(revision 36303)
     51 +++ source/common/ubidiimp.h	(revision 36304)
     52 @@ -173,7 +173,7 @@
     53      /* array of opening entries which should be enough in most cases; no malloc() */
     54      Opening simpleOpenings[SIMPLE_OPENINGS_SIZE];
     55      Opening *openings;                  /* pointer to current array of entries */
     56 -    int32_t openingsSize;               /* number of allocated entries */
     57 +    int32_t openingsCount;              /* number of allocated entries */
     58      int32_t isoRunLast;                 /* index of last used entry */
     59      /* array of nested isolated sequence entries; can never excess UBIDI_MAX_EXPLICIT_LEVEL
     60         + 1 for index 0, + 1 for before the first isolated sequence */
     61 Index: source/common/ubidi.c
     62 ===================================================================
     63 --- source/common/ubidi.c	(revision 36303)
     64 +++ source/common/ubidi.c	(revision 36304)
     65 @@ -679,10 +679,10 @@
     66      bd->isoRuns[0].contextPos=0;
     67      if(pBiDi->openingsMemory) {
     68          bd->openings=pBiDi->openingsMemory;
     69 -        bd->openingsSize=pBiDi->openingsSize;
     70 +        bd->openingsCount=pBiDi->openingsSize / sizeof(Opening);
     71      } else {
     72          bd->openings=bd->simpleOpenings;
     73 -        bd->openingsSize=SIMPLE_OPENINGS_SIZE;
     74 +        bd->openingsCount=SIMPLE_OPENINGS_SIZE;
     75      }
     76      bd->isNumbersSpecial=bd->pBiDi->reorderingMode==UBIDI_REORDER_NUMBERS_SPECIAL ||
     77                           bd->pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL;
     78 @@ -743,7 +743,7 @@
     79  bracketAddOpening(BracketData *bd, UChar match, int32_t position) {
     80      IsoRun *pLastIsoRun=&bd->isoRuns[bd->isoRunLast];
     81      Opening *pOpening;
     82 -    if(pLastIsoRun->limit>=bd->openingsSize) {  /* no available new entry */
     83 +    if(pLastIsoRun->limit>=bd->openingsCount) {  /* no available new entry */
     84          UBiDi *pBiDi=bd->pBiDi;
     85          if(!getInitialOpeningsMemory(pBiDi, pLastIsoRun->limit * 2))
     86              return FALSE;
     87 @@ -751,7 +751,7 @@
     88              uprv_memcpy(pBiDi->openingsMemory, bd->simpleOpenings,
     89                          SIMPLE_OPENINGS_SIZE * sizeof(Opening));
     90          bd->openings=pBiDi->openingsMemory;     /* may have changed */
     91 -        bd->openingsSize=pBiDi->openingsSize;
     92 +        bd->openingsCount=pBiDi->openingsSize / sizeof(Opening);
     93      }
     94      pOpening=&bd->openings[pLastIsoRun->limit];
     95      pOpening->position=position;
     96