Skip to content
Permalink
Browse files

WIN32: Fix free being used on arrays allocated with new

  • Loading branch information
criezy committed Nov 6, 2019
1 parent 4b21711 commit 8b586ed4189ed58e43d77f7307d3f2b8f30ea20a
Showing with 21 additions and 7 deletions.
  1. +21 −7 backends/platform/sdl/win32/win32.cpp
@@ -459,9 +459,6 @@ char *OSystem_Win32::convertEncoding(const char* to, const char *from, const cha
}

// Add ending zeros
char *wString = (char *) calloc(sizeof(char), length + 2);
memcpy(wString, string, length);

WCHAR *tmpStr;
if (Common::String(from).hasPrefixIgnoreCase("utf-16")) {
// Allocate space for string and 2 ending zeros
@@ -474,11 +471,20 @@ char *OSystem_Win32::convertEncoding(const char* to, const char *from, const cha
}
memcpy(tmpStr, string, length);
} else {
tmpStr = Win32::ansiToUnicode(string, Win32::getCodePageId(from));
// Win32::ansiToUnicode uses new to allocate the memory. We need to copy it into an array
// allocated with malloc as it is going to be freed using free.
WCHAR *tmpStr2 = Win32::ansiToUnicode(string, Win32::getCodePageId(from));
if (!tmpStr2) {
if (newString != nullptr)
free(newString);
return nullptr;
}
size_t size = wcslen(tmpStr2) + 1; // +1 for the terminating null wchar
tmpStr = (WCHAR *) malloc(sizeof(WCHAR) * size);
memcpy(tmpStr, tmpStr2, sizeof(WCHAR) * size);
delete[] tmpStr2;
}

free(wString);

if (newString != nullptr)
free(newString);

@@ -492,7 +498,15 @@ char *OSystem_Win32::convertEncoding(const char* to, const char *from, const cha
} else {
result = Win32::unicodeToAnsi(tmpStr, Win32::getCodePageId(to));
free(tmpStr);
return result;
if (!result)
return nullptr;
// Win32::unicodeToAnsi uses new to allocate the memory. We need to copy it into an array
// allocated with malloc as it is going to be freed using free.
size_t size = strlen(result) + 1;
char *resultCopy = (char *) malloc(sizeof(char) * size);
memcpy(resultCopy, result, sizeof(char) * size);
delete[] result;
return resultCopy;
}
}

0 comments on commit 8b586ed

Please sign in to comment.
You can’t perform that action at this time.