From 5faab922bda8dac2efa7a37dc142a700699ab172 Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Tue, 15 Sep 2015 18:03:08 +0000 Subject: [PATCH] ICU-11709 do not clobber existing UErrorCode failure code, do not orphan() names until you know that the Enumeration was allocated and thus did adopt X-SVN-Rev: 37956 --- icu4c/source/i18n/numsys.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/icu4c/source/i18n/numsys.cpp b/icu4c/source/i18n/numsys.cpp index 37f3aa75fcc..ac3f498cd77 100644 --- a/icu4c/source/i18n/numsys.cpp +++ b/icu4c/source/i18n/numsys.cpp @@ -244,7 +244,7 @@ UBool NumberingSystem::isAlgorithmic() const { } StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { - + // TODO(ticket #11908): Init-once static cache, with u_cleanup() callback. static StringEnumeration* availableNames = NULL; if (U_FAILURE(status)) { @@ -252,9 +252,9 @@ StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { } if ( availableNames == NULL ) { + // TODO: Simple array of UnicodeString objects, based on length of table resource? LocalPointer numsysNames(new UVector(uprv_deleteUObject, NULL, status), status); if (U_FAILURE(status)) { - status = U_MEMORY_ALLOCATION_ERROR; return NULL; } @@ -275,8 +275,15 @@ StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { } ures_close(numberingSystemsInfo); - availableNames = new NumsysNameEnumeration(numsysNames.orphan(),status); - + if (U_FAILURE(status)) { + return NULL; + } + availableNames = new NumsysNameEnumeration(numsysNames.getAlias(), status); + if (availableNames == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + numsysNames.orphan(); // The names got adopted. } return availableNames;