Index: source/tools/toolutil/flagparser.c |
diff --git a/source/tools/toolutil/flagparser.c b/source/tools/toolutil/flagparser.c |
index d1aece6684ac6f343239230c9b8be48a671834a5..554341534b44569418b12f1c1aacfa01aa77577f 100644 |
--- a/source/tools/toolutil/flagparser.c |
+++ b/source/tools/toolutil/flagparser.c |
@@ -1,5 +1,5 @@ |
/****************************************************************************** |
- * Copyright (C) 2009-2012, International Business Machines |
+ * Copyright (C) 2009-2015, International Business Machines |
* Corporation and others. All Rights Reserved. |
******************************************************************************* |
*/ |
@@ -21,8 +21,8 @@ static int32_t getFlagOffset(const char *buffer, int32_t bufferSize); |
*/ |
U_CAPI int32_t U_EXPORT2 |
parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, const char ** flagNames, int32_t numOfFlags, UErrorCode *status) { |
- char* buffer = uprv_malloc(sizeof(char) * currentBufferSize); |
- char* tmpFlagBuffer = uprv_malloc(sizeof(char) * flagBufferSize); |
+ char* buffer = NULL; |
+ char* tmpFlagBuffer = NULL; |
UBool allocateMoreSpace = FALSE; |
int32_t idx, i; |
int32_t result = 0; |
@@ -30,12 +30,15 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, |
FileStream *f = T_FileStream_open(fileName, "r"); |
if (f == NULL) { |
*status = U_FILE_ACCESS_ERROR; |
- return -1; |
+ goto parseFlagsFile_cleanup; |
} |
+ |
+ buffer = uprv_malloc(sizeof(char) * currentBufferSize); |
+ tmpFlagBuffer = uprv_malloc(sizeof(char) * flagBufferSize); |
- if (buffer == NULL) { |
+ if (buffer == NULL || tmpFlagBuffer == NULL) { |
*status = U_MEMORY_ALLOCATION_ERROR; |
- return -1; |
+ goto parseFlagsFile_cleanup; |
} |
do { |
@@ -45,9 +48,8 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, |
uprv_free(buffer); |
buffer = uprv_malloc(sizeof(char) * currentBufferSize); |
if (buffer == NULL) { |
- uprv_free(tmpFlagBuffer); |
*status = U_MEMORY_ALLOCATION_ERROR; |
- return -1; |
+ goto parseFlagsFile_cleanup; |
} |
} |
for (i = 0; i < numOfFlags;) { |
@@ -89,10 +91,15 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, |
} |
} while (allocateMoreSpace && U_SUCCESS(*status)); |
+parseFlagsFile_cleanup: |
uprv_free(tmpFlagBuffer); |
uprv_free(buffer); |
T_FileStream_close(f); |
+ |
+ if (U_FAILURE(*status)) { |
+ return -1; |
+ } |
if (U_SUCCESS(*status) && result == 0) { |
currentBufferSize = DEFAULT_BUFFER_SIZE; |