]> granicus.if.org Git - icu/commitdiff
ICU-20802 OOM not handled in uloc_openKeywordList.
authorJeff Genovy <29107334+jefgen@users.noreply.github.com>
Fri, 30 Aug 2019 19:03:16 +0000 (12:03 -0700)
committerJeff Genovy <29107334+jefgen@users.noreply.github.com>
Fri, 30 Aug 2019 23:35:26 +0000 (16:35 -0700)
Also change to use LocalPointer and nullptr instead of NULL.

icu4c/source/common/uloc.cpp

index 5a12697b85ee1e66eeafea09846c904bf2749c86..d58bdfa64e99d4088ac9f7a458cf7d6e4a245c2e 100644 (file)
@@ -1457,31 +1457,32 @@ static const UEnumeration gKeywordsEnum = {
 U_CAPI UEnumeration* U_EXPORT2
 uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status)
 {
-    UKeywordsContext *myContext = NULL;
-    UEnumeration *result = NULL;
+    LocalPointer<UKeywordsContext> myContext;
+    LocalPointer<UEnumeration> result;
 
-    if(U_FAILURE(*status)) {
-        return NULL;
+    if (U_FAILURE(*status)) {
+        return nullptr;
     }
-    result = (UEnumeration *)uprv_malloc(sizeof(UEnumeration));
-    /* Null pointer test */
-    if (result == NULL) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
+    result.adoptInsteadAndCheckErrorCode(static_cast<UEnumeration *>(uprv_malloc(sizeof(UEnumeration))), *status);
+    if (U_FAILURE(*status)) {
+        return nullptr;
+    }
+    uprv_memcpy(result.getAlias(), &gKeywordsEnum, sizeof(UEnumeration));
+    
+    myContext.adoptInsteadAndCheckErrorCode(static_cast<UKeywordsContext *>(uprv_malloc(sizeof(UKeywordsContext))), *status);
+    if (U_FAILURE(*status)) {
+        return nullptr;
     }
-    uprv_memcpy(result, &gKeywordsEnum, sizeof(UEnumeration));
-    myContext = static_cast<UKeywordsContext *>(uprv_malloc(sizeof(UKeywordsContext)));
-    if (myContext == NULL) {
+    myContext->keywords = static_cast<char *>(uprv_malloc(keywordListSize+1));
+    if (myContext->keywords == nullptr) {
         *status = U_MEMORY_ALLOCATION_ERROR;
-        uprv_free(result);
-        return NULL;
+        return nullptr;
     }
-    myContext->keywords = (char *)uprv_malloc(keywordListSize+1);
     uprv_memcpy(myContext->keywords, keywordList, keywordListSize);
     myContext->keywords[keywordListSize] = 0;
     myContext->current = myContext->keywords;
-    result->context = myContext;
-    return result;
+    result->context = myContext.orphan();
+    return result.orphan();
 }
 
 U_CAPI UEnumeration* U_EXPORT2