]> granicus.if.org Git - icu/commitdiff
ICU-8451 Fixing some memory leaks in region.cpp
authorJohn Emmons <emmo@us.ibm.com>
Tue, 15 Jan 2013 08:02:48 +0000 (08:02 +0000)
committerJohn Emmons <emmo@us.ibm.com>
Tue, 15 Jan 2013 08:02:48 +0000 (08:02 +0000)
X-SVN-Rev: 33053

icu4c/source/i18n/region.cpp

index 77713d70b7302afdef6d9a0031a2816345805032..9c3ecb4889c0f3fd51f027ed5b7b280aee934295 100644 (file)
@@ -148,6 +148,7 @@ void Region::loadRegionData() {
         const char *aliasFrom = ures_getKey(res);\r
         UnicodeString* aliasFromStr = new UnicodeString(aliasFrom);\r
         UnicodeString aliasTo = ures_getUnicodeString(res,&status);\r
+        ures_close(res);\r
 \r
         Region *aliasToRegion = (Region *) uhash_get(regionIDMap,&aliasTo);\r
         Region *aliasFromRegion = (Region *)uhash_get(regionIDMap,aliasFromStr);\r
@@ -155,7 +156,7 @@ void Region::loadRegionData() {
         if ( aliasToRegion != NULL && aliasFromRegion == NULL ) { // This is just an alias from some string to a region\r
             uhash_put(regionAliases,(void *)aliasFromStr, (void *)aliasToRegion,&status);\r
         } else {\r
-           if ( aliasFromRegion == NULL ) { // Deprecated region code not in the master codes list - so need to create a deprecated region for it.\r
+            if ( aliasFromRegion == NULL ) { // Deprecated region code not in the master codes list - so need to create a deprecated region for it.\r
                 aliasFromRegion = new Region();\r
                 aliasFromRegion->idStr.setTo(*aliasFromStr);\r
                 aliasFromRegion->idStr.extract(0,aliasFromRegion->idStr.length(),aliasFromRegion->id,sizeof(aliasFromRegion->id),US_INV);\r
@@ -215,6 +216,7 @@ void Region::loadRegionData() {
                 uhash_put(regionAliases,(void *)code3, (void *)r,&status);\r
             }                    \r
         }\r
+        ures_close(mapping);\r
     }\r
 \r
     // Now fill in the special cases for WORLD, UNKNOWN, CONTINENTS, and GROUPINGS\r
@@ -369,6 +371,7 @@ Region::getInstance(const char *region_code, UErrorCode &status) {
         pv->reset(status);\r
         const UnicodeString *ustr = pv->snext(status);\r
         r = (Region *)uhash_get(regionIDMap,(void *)ustr);\r
+        delete pv;\r
     }\r
 \r
     return r;\r
@@ -408,6 +411,7 @@ Region::getInstance (int32_t code, UErrorCode &status) {
         pv->reset(status);\r
         const UnicodeString *ustr = pv->snext(status);\r
         r = (Region *)uhash_get(regionIDMap,(void *)ustr);\r
+        delete pv;\r
     }\r
 \r
     return r;\r
@@ -485,7 +489,7 @@ Region::getContainedRegions( URegionType type ) const {
     loadRegionData();\r
 \r
     UErrorCode status = U_ZERO_ERROR;\r
-    UVector *result = new UVector(uprv_deleteUObject, uhash_compareChars, status);\r
+    UVector *result = new UVector(NULL, uhash_compareChars, status);\r
  \r
     StringEnumeration *cr = getContainedRegions();\r
 \r
@@ -501,6 +505,7 @@ Region::getContainedRegions( URegionType type ) const {
                 const Region *r2 = Region::getInstance(id2,status);\r
                 result->addElement((void *)r2->id,status);\r
             }\r
+            delete children;\r
         }\r
     }\r
     return new RegionNameEnumeration(result,status);\r
@@ -572,9 +577,26 @@ Region::getType() const {
     return type;\r
 }\r
 \r
-RegionNameEnumeration::RegionNameEnumeration(UVector *fNameList, UErrorCode& /*status*/) {\r
+RegionNameEnumeration::RegionNameEnumeration(UVector *fNameList, UErrorCode& status) {\r
     pos=0;\r
-    fRegionNames = fNameList;\r
+    if (fNameList) {\r
+        fRegionNames = new UVector(NULL, uhash_compareChars, fNameList->size(),status);\r
+        for ( int32_t i = 0 ; i < fNameList->size() ; i++ ) {\r
+            char *region_name = (char *) uprv_malloc(sizeof(fNameList->elementAt(i)));\r
+            if (!region_name) {\r
+                status = U_MEMORY_ALLOCATION_ERROR;\r
+                delete fRegionNames;\r
+                fRegionNames = NULL;\r
+                return;\r
+            }\r
+            uprv_strcpy(region_name,(char *)fNameList->elementAt(i));\r
+            fRegionNames->addElement(region_name,status);\r
+            \r
+        }\r
+    }\r
+    else { \r
+        fRegionNames = fNameList;\r
+    }\r
 }\r
 \r
 const char*\r