Home | History | Annotate | Download | only in patches
      1 Index: source/common/uloc.c
      2 ===================================================================
      3 --- source/common/uloc.c	(revision 68397)
      4 +++ source/common/uloc.c	(working copy)
      5 @@ -693,6 +693,13 @@
      6                      keywordList[numKeywords].keyword[n++] = uprv_tolower(pos[i]);
      7                  }
      8              }
      9 +
     10 +            /* zero-length keyword is an error. */
     11 +            if (n == 0) {
     12 +                *status = U_INVALID_FORMAT_ERROR;
     13 +                return 0;
     14 +            }
     15 +
     16              keywordList[numKeywords].keyword[n] = 0;
     17              keywordList[numKeywords].keywordLen = n;
     18              /* now grab the value part. First we skip the '=' */
     19 @@ -701,8 +708,15 @@
     20              while(*equalSign == ' ') {
     21                  equalSign++;
     22              }
     23 +
     24 +            /* Premature end or zero-length value */
     25 +            if (!equalSign || equalSign == semicolon) {
     26 +                *status = U_INVALID_FORMAT_ERROR;
     27 +                return 0;
     28 +            }
     29 +
     30              keywordList[numKeywords].valueStart = equalSign;
     31 -            
     32 +
     33              pos = semicolon;
     34              i = 0;
     35              if(pos) {
     36 @@ -713,7 +727,7 @@
     37                  pos++;
     38              } else {
     39                  i = (int32_t)uprv_strlen(equalSign);
     40 -                while(equalSign[i-1] == ' ') {
     41 +                while(i && equalSign[i-1] == ' ') {
     42                      i--;
     43                  }
     44                  keywordList[numKeywords].valueLen = i;
     45 @@ -1797,7 +1811,7 @@
     46                  int32_t variantLen = _deleteVariant(variant, uprv_min(variantSize, (nameCapacity-len)), variantToCompare, n);
     47                  len -= variantLen;
     48                  if (variantLen > 0) {
     49 -                    if (name[len-1] == '_') { /* delete trailing '_' */
     50 +                    if (len > 0 && name[len-1] == '_') { /* delete trailing '_' */
     51                          --len;
     52                      }
     53                      addKeyword = VARIANT_MAP[j].keyword;
     54 @@ -1805,7 +1819,7 @@
     55                      break;
     56                  }
     57              }
     58 -            if (name[len-1] == '_') { /* delete trailing '_' */
     59 +            if (len > 0 && len <= nameCapacity && name[len-1] == '_') { /* delete trailing '_' */
     60                  --len;
     61              }
     62          }
     63 Index: source/common/uresbund.c
     64 ===================================================================
     65 --- source/common/uresbund.c	(revision 122103)
     66 +++ source/common/uresbund.c	(working copy)
     67 @@ -319,7 +319,7 @@
     68      UResourceDataEntry *r = NULL;
     69      UResourceDataEntry find;
     70      /*int32_t hashValue;*/
     71 -    char name[96];
     72 +    char name[100];
     73      char aliasName[100] = { 0 };
     74      int32_t aliasLen = 0;
     75      /*UBool isAlias = FALSE;*/
     76 @@ -528,8 +528,8 @@
     77      UBool hasChopped = TRUE;
     78      UBool usingUSRData = U_USE_USRDATA && ( path == NULL || uprv_strncmp(path,U_ICUDATA_NAME,8) == 0);
     79  
     80 -    char name[96];
     81 -    char usrDataPath[96];
     82 +    char name[100];
     83 +    char usrDataPath[100];
     84  
     85      initCache(status);
     86  
     87