1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-11 02:58:02 -06:00

Windows: Fix memory access issues when processing language XML files. Avoid writing to locked memory resource which can trigger crash.

This commit is contained in:
Mounir IDRASSI
2015-07-13 16:18:40 +02:00
parent 52146825de
commit 103018b367

View File

@@ -32,12 +32,14 @@ BOOL LocalizationActive;
int LocalizationSerialNo; int LocalizationSerialNo;
wchar_t UnknownString[1024]; wchar_t UnknownString[1024];
static char *LanguageFileBuffer; static char *LanguageFileBuffer = NULL;
static HANDLE LanguageFileFindHandle = INVALID_HANDLE_VALUE; static HANDLE LanguageFileFindHandle = INVALID_HANDLE_VALUE;
static char PreferredLangId[6]; static char PreferredLangId[6];
static char *LanguageResource; static char *LanguageResource = NULL;
static char *HeaderResource[2]; static DWORD LanguageResourceSize = 0;
static char ActiveLangPackVersion[6]; static char *HeaderResource[2] = {NULL, NULL};
static DWORD HeaderResourceSize[2] = {0, 0};
static char ActiveLangPackVersion[6] = {0};
static char *MapFirstLanguageFile () static char *MapFirstLanguageFile ()
{ {
@@ -47,14 +49,31 @@ static char *MapFirstLanguageFile ()
LanguageFileFindHandle = INVALID_HANDLE_VALUE; LanguageFileFindHandle = INVALID_HANDLE_VALUE;
} }
if (LanguageFileBuffer != NULL)
{
free (LanguageFileBuffer);
LanguageFileBuffer = NULL;
}
if (LanguageResource == NULL) if (LanguageResource == NULL)
{ {
DWORD size; DWORD size;
LanguageResource = MapResource ("Xml", IDR_LANGUAGE, &size); LanguageResource = MapResource ("Xml", IDR_LANGUAGE, &size);
LanguageResource[size - 1] = 0; if (LanguageResource)
LanguageResourceSize = size;
} }
return LanguageResource; if (LanguageResource)
{
LanguageFileBuffer = malloc(LanguageResourceSize + 1);
if (LanguageFileBuffer)
{
memcpy (LanguageFileBuffer, LanguageResource, LanguageResourceSize);
LanguageFileBuffer[LanguageResourceSize] = 0;
}
}
return LanguageFileBuffer;
} }
@@ -66,6 +85,13 @@ static char *MapNextLanguageFile ()
DWORD read; DWORD read;
BOOL bStatus; BOOL bStatus;
/* free memory here to avoid leaks */
if (LanguageFileBuffer != NULL)
{
free (LanguageFileBuffer);
LanguageFileBuffer = NULL;
}
if (LanguageFileFindHandle == INVALID_HANDLE_VALUE) if (LanguageFileFindHandle == INVALID_HANDLE_VALUE)
{ {
GetModuleFileNameW (NULL, f, sizeof (f) / sizeof (f[0])); GetModuleFileNameW (NULL, f, sizeof (f) / sizeof (f[0]));
@@ -84,9 +110,9 @@ static char *MapNextLanguageFile ()
return NULL; return NULL;
} }
if (LanguageFileFindHandle == INVALID_HANDLE_VALUE) return NULL;
if (find.nFileSizeHigh != 0) return NULL; if (find.nFileSizeHigh != 0) return NULL;
if (LanguageFileBuffer != NULL) free (LanguageFileBuffer);
LanguageFileBuffer = malloc(find.nFileSizeLow + 1); LanguageFileBuffer = malloc(find.nFileSizeLow + 1);
if (LanguageFileBuffer == NULL) return NULL; if (LanguageFileBuffer == NULL) return NULL;
@@ -95,6 +121,7 @@ static char *MapNextLanguageFile ()
if (t == NULL) if (t == NULL)
{ {
free(LanguageFileBuffer); free(LanguageFileBuffer);
LanguageFileBuffer = NULL;
return NULL; return NULL;
} }
@@ -105,6 +132,7 @@ static char *MapNextLanguageFile ()
if (file == INVALID_HANDLE_VALUE) if (file == INVALID_HANDLE_VALUE)
{ {
free(LanguageFileBuffer); free(LanguageFileBuffer);
LanguageFileBuffer = NULL;
return NULL; return NULL;
} }
@@ -113,6 +141,7 @@ static char *MapNextLanguageFile ()
if (!bStatus || (read != find.nFileSizeLow)) if (!bStatus || (read != find.nFileSizeLow))
{ {
free(LanguageFileBuffer); free(LanguageFileBuffer);
LanguageFileBuffer = NULL;
return NULL; return NULL;
} }
@@ -126,7 +155,7 @@ BOOL LoadLanguageFile ()
{ {
DWORD size; DWORD size;
BYTE *res; BYTE *res;
char *xml, *header; char *xml, *header, *headerPtr;
char langId[6] = "en", attr[32768], key[128]; char langId[6] = "en", attr[32768], key[128];
BOOL defaultLangParsed = FALSE, langFound = FALSE; BOOL defaultLangParsed = FALSE, langFound = FALSE;
WCHAR wattr[32768]; WCHAR wattr[32768];
@@ -311,10 +340,22 @@ BOOL LoadLanguageFile ()
if (HeaderResource[i] == NULL) if (HeaderResource[i] == NULL)
{ {
HeaderResource[i] = MapResource ("Header", headers[i], &size); HeaderResource[i] = MapResource ("Header", headers[i], &size);
*(HeaderResource[i] + size - 1) = 0; if (HeaderResource[i])
HeaderResourceSize[i] = size;
} }
header = HeaderResource[i]; headerPtr = NULL;
if (HeaderResource[i])
{
headerPtr = (char*) malloc (HeaderResourceSize[i] + 1);
if (headerPtr)
{
memcpy (headerPtr, HeaderResource[i], HeaderResourceSize[i]);
headerPtr [HeaderResourceSize[i]] = 0;
}
}
header = headerPtr;
if (header == NULL) return FALSE; if (header == NULL) return FALSE;
do do
@@ -328,6 +369,8 @@ BOOL LoadLanguageFile ()
} }
} while ((header = strchr (header, '\n') + 1) != (char *) 1); } while ((header = strchr (header, '\n') + 1) != (char *) 1);
free (headerPtr);
} }
return TRUE; return TRUE;