diff options
| -rw-r--r-- | common/encoding.cpp | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/common/encoding.cpp b/common/encoding.cpp index 30d8dabd7f..00870e71ab 100644 --- a/common/encoding.cpp +++ b/common/encoding.cpp @@ -173,7 +173,7 @@ char *Encoding::convertIconv(iconv_t iconvHandle, const char *string, size_t len  	size_t inSize = length;  	size_t outSize = inSize; -	size_t stringSize = inSize > 4 ? inSize : outSize; +	size_t stringSize = inSize > 4 ? inSize : 4;  #ifdef ICONV_USES_CONST @@ -184,12 +184,11 @@ char *Encoding::convertIconv(iconv_t iconvHandle, const char *string, size_t len  	memcpy(src, string, length);  #endif // ICONV_USES_CONST -	char *buffer = (char *) malloc(sizeof(char) * stringSize); +	char *buffer = (char *) calloc(sizeof(char), stringSize);  	if (!buffer) {  		warning ("Cannot allocate memory for converting string");  		return nullptr;  	} -	memset(buffer, 0, stringSize);  	char *dst = buffer;  	bool error = false; @@ -215,6 +214,7 @@ char *Encoding::convertIconv(iconv_t iconvHandle, const char *string, size_t len  			}  		}  	} +	iconv(iconvHandle, NULL, NULL, &dst, &outSize);  	// Add a zero character to the end. Hopefuly UTF32 uses the most bytes from  	// all possible encodings, so add 4 zero bytes.  	buffer = (char *) realloc(buffer, stringSize + 4); @@ -224,8 +224,11 @@ char *Encoding::convertIconv(iconv_t iconvHandle, const char *string, size_t len  	delete[] originalSrc;  #endif // ICONV_USES_CONST -	if (error) +	if (error) { +		if (buffer) +			free(buffer);  		return nullptr; +	}  	debug("Size: %d", stringSize);  	return buffer;  | 
