ICU-6132 Check for memory allocation error in CompoundTransliterator.
X-SVN-Rev: 23196
This commit is contained in:
parent
7636e40123
commit
a9d9611f99
@ -1,6 +1,6 @@
|
||||
/*
|
||||
**********************************************************************
|
||||
* Copyright (C) 1999-2006, International Business Machines
|
||||
* Copyright (C) 1999-2008, International Business Machines
|
||||
* Corporation and others. All Rights Reserved.
|
||||
**********************************************************************
|
||||
* Date Name Description
|
||||
@ -282,18 +282,38 @@ void CompoundTransliterator::freeTransliterators(void) {
|
||||
CompoundTransliterator& CompoundTransliterator::operator=(
|
||||
const CompoundTransliterator& t) {
|
||||
Transliterator::operator=(t);
|
||||
int32_t i;
|
||||
int32_t i = 0;
|
||||
UBool failed = FALSE;
|
||||
if (trans != NULL) {
|
||||
for (i=0; i<count; ++i) {
|
||||
delete trans[i];
|
||||
trans[i] = 0;
|
||||
}
|
||||
}
|
||||
if (t.count > count) {
|
||||
if (trans != NULL) {
|
||||
uprv_free(trans);
|
||||
}
|
||||
trans = (Transliterator **)uprv_malloc(t.count * sizeof(Transliterator *));
|
||||
}
|
||||
count = t.count;
|
||||
if (trans != NULL) {
|
||||
for (i=0; i<count; ++i) {
|
||||
trans[i] = t.trans[i]->clone();
|
||||
if (trans[i] == NULL) {
|
||||
failed = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if memory allocation failed delete backwards trans array
|
||||
if (failed && i > 0) {
|
||||
int32_t n;
|
||||
for (n = i-1; n >= 0; n--) {
|
||||
uprv_free(trans[n]);
|
||||
trans[n] = NULL;
|
||||
}
|
||||
}
|
||||
numAnonymousRBTs = t.numAnonymousRBTs;
|
||||
return *this;
|
||||
@ -326,8 +346,25 @@ const Transliterator& CompoundTransliterator::getTransliterator(int32_t index) c
|
||||
void CompoundTransliterator::setTransliterators(Transliterator* const transliterators[],
|
||||
int32_t transCount) {
|
||||
Transliterator** a = (Transliterator **)uprv_malloc(transCount * sizeof(Transliterator *));
|
||||
for (int32_t i=0; i<transCount; ++i) {
|
||||
if (a == NULL) {
|
||||
return;
|
||||
}
|
||||
int32_t i = 0;
|
||||
UBool failed = FALSE;
|
||||
for (i=0; i<transCount; ++i) {
|
||||
a[i] = transliterators[i]->clone();
|
||||
if (a[i] == NULL) {
|
||||
failed = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (failed && i > 0) {
|
||||
int32_t n;
|
||||
for (n = i-1; n >= 0; n--) {
|
||||
uprv_free(a[n]);
|
||||
a[n] = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
adoptTransliterators(a, transCount);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user