Index: source/common/uts46.cpp |
diff --git a/source/common/uts46.cpp b/source/common/uts46.cpp |
index 80900a019b42f2c9b18f105d631951a3e48caf97..13a1f246c21cc91ee67a2aa2bafe76db85c5bd14 100644 |
--- a/source/common/uts46.cpp |
+++ b/source/common/uts46.cpp |
@@ -1,6 +1,6 @@ |
/* |
******************************************************************************* |
-* Copyright (C) 2010-2014, International Business Machines |
+* Copyright (C) 2010-2015, International Business Machines |
* Corporation and others. All Rights Reserved. |
******************************************************************************* |
* file name: uts46.cpp |
@@ -180,7 +180,7 @@ private: |
int32_t |
markBadACELabel(UnicodeString &dest, |
int32_t labelStart, int32_t labelLength, |
- UBool toASCII, IDNAInfo &info) const; |
+ UBool toASCII, IDNAInfo &info, UErrorCode &errorCode) const; |
void |
checkLabelBiDi(const UChar *label, int32_t labelLength, IDNAInfo &info) const; |
@@ -587,6 +587,9 @@ UTS46::processUnicode(const UnicodeString &src, |
int32_t |
UTS46::mapDevChars(UnicodeString &dest, int32_t labelStart, int32_t mappingStart, |
UErrorCode &errorCode) const { |
+ if(U_FAILURE(errorCode)) { |
+ return 0; |
+ } |
int32_t length=dest.length(); |
UChar *s=dest.getBuffer(dest[mappingStart]==0xdf ? length+1 : length); |
if(s==NULL) { |
@@ -644,6 +647,9 @@ UTS46::mapDevChars(UnicodeString &dest, int32_t labelStart, int32_t mappingStart |
uts46Norm2.normalize(dest.tempSubString(labelStart), normalized, errorCode); |
if(U_SUCCESS(errorCode)) { |
dest.replace(labelStart, 0x7fffffff, normalized); |
+ if(dest.isBogus()) { |
+ errorCode=U_MEMORY_ALLOCATION_ERROR; |
+ } |
return dest.length(); |
} |
} |
@@ -665,9 +671,16 @@ isNonASCIIDisallowedSTD3Valid(UChar32 c) { |
// Returns labelLength (= the new label length). |
static int32_t |
replaceLabel(UnicodeString &dest, int32_t destLabelStart, int32_t destLabelLength, |
- const UnicodeString &label, int32_t labelLength) { |
+ const UnicodeString &label, int32_t labelLength, UErrorCode &errorCode) { |
+ if(U_FAILURE(errorCode)) { |
+ return 0; |
+ } |
if(&label!=&dest) { |
dest.replace(destLabelStart, destLabelLength, label); |
+ if(dest.isBogus()) { |
+ errorCode=U_MEMORY_ALLOCATION_ERROR; |
+ return 0; |
+ } |
} |
return labelLength; |
} |
@@ -677,6 +690,9 @@ UTS46::processLabel(UnicodeString &dest, |
int32_t labelStart, int32_t labelLength, |
UBool toASCII, |
IDNAInfo &info, UErrorCode &errorCode) const { |
+ if(U_FAILURE(errorCode)) { |
+ return 0; |
+ } |
UnicodeString fromPunycode; |
UnicodeString *labelString; |
const UChar *label=dest.getBuffer()+labelStart; |
@@ -711,7 +727,7 @@ UTS46::processLabel(UnicodeString &dest, |
fromPunycode.releaseBuffer(unicodeLength); |
if(U_FAILURE(punycodeErrorCode)) { |
info.labelErrors|=UIDNA_ERROR_PUNYCODE; |
- return markBadACELabel(dest, labelStart, labelLength, toASCII, info); |
+ return markBadACELabel(dest, labelStart, labelLength, toASCII, info, errorCode); |
} |
// Check for NFC, and for characters that are not |
// valid or deviation characters according to the normalizer. |
@@ -726,7 +742,7 @@ UTS46::processLabel(UnicodeString &dest, |
} |
if(!isValid) { |
info.labelErrors|=UIDNA_ERROR_INVALID_ACE_LABEL; |
- return markBadACELabel(dest, labelStart, labelLength, toASCII, info); |
+ return markBadACELabel(dest, labelStart, labelLength, toASCII, info, errorCode); |
} |
labelString=&fromPunycode; |
label=fromPunycode.getBuffer(); |
@@ -739,7 +755,8 @@ UTS46::processLabel(UnicodeString &dest, |
// Validity check |
if(labelLength==0) { |
info.labelErrors|=UIDNA_ERROR_EMPTY_LABEL; |
- return replaceLabel(dest, destLabelStart, destLabelLength, *labelString, labelLength); |
+ return replaceLabel(dest, destLabelStart, destLabelLength, |
+ *labelString, labelLength, errorCode); |
} |
// labelLength>0 |
if(labelLength>=4 && label[2]==0x2d && label[3]==0x2d) { |
@@ -861,7 +878,7 @@ UTS46::processLabel(UnicodeString &dest, |
info.labelErrors|=UIDNA_ERROR_LABEL_TOO_LONG; |
} |
return replaceLabel(dest, destLabelStart, destLabelLength, |
- punycode, punycodeLength); |
+ punycode, punycodeLength, errorCode); |
} else { |
// all-ASCII label |
if(labelLength>63) { |
@@ -874,10 +891,11 @@ UTS46::processLabel(UnicodeString &dest, |
// then leave it but make sure it does not look valid. |
if(wasPunycode) { |
info.labelErrors|=UIDNA_ERROR_INVALID_ACE_LABEL; |
- return markBadACELabel(dest, destLabelStart, destLabelLength, toASCII, info); |
+ return markBadACELabel(dest, destLabelStart, destLabelLength, toASCII, info, errorCode); |
} |
} |
- return replaceLabel(dest, destLabelStart, destLabelLength, *labelString, labelLength); |
+ return replaceLabel(dest, destLabelStart, destLabelLength, |
+ *labelString, labelLength, errorCode); |
} |
// Make sure an ACE label does not look valid. |
@@ -886,7 +904,10 @@ UTS46::processLabel(UnicodeString &dest, |
int32_t |
UTS46::markBadACELabel(UnicodeString &dest, |
int32_t labelStart, int32_t labelLength, |
- UBool toASCII, IDNAInfo &info) const { |
+ UBool toASCII, IDNAInfo &info, UErrorCode &errorCode) const { |
+ if(U_FAILURE(errorCode)) { |
+ return 0; |
+ } |
UBool disallowNonLDHDot=(options&UIDNA_USE_STD3_RULES)!=0; |
UBool isASCII=TRUE; |
UBool onlyLDH=TRUE; |
@@ -914,6 +935,10 @@ UTS46::markBadACELabel(UnicodeString &dest, |
} while(++s<limit); |
if(onlyLDH) { |
dest.insert(labelStart+labelLength, (UChar)0xfffd); |
+ if(dest.isBogus()) { |
+ errorCode=U_MEMORY_ALLOCATION_ERROR; |
+ return 0; |
+ } |
++labelLength; |
} else { |
if(toASCII && isASCII && labelLength>63) { |