diff --git a/channels/client/addin.c b/channels/client/addin.c index 14f2aa601..8f4d54bc3 100644 --- a/channels/client/addin.c +++ b/channels/client/addin.c @@ -3,6 +3,8 @@ * Channel Addins * * Copyright 2012 Marc-Andre Moreau + * Copyright 2015 Thincast Technologies GmbH + * Copyright 2015 DI (FH) Martin Haimberger * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +37,9 @@ #include "addin.h" +#include +#define TAG CHANNELS_TAG("addin") + extern const STATIC_ENTRY_TABLE CLIENT_STATIC_ENTRY_TABLES[]; void* freerdp_channels_find_static_entry_in_table(const STATIC_ENTRY_TABLE* table, const char* identifier) @@ -83,18 +88,28 @@ FREERDP_ADDIN** freerdp_channels_list_client_static_addins(LPSTR pszName, LPSTR { int i, j; DWORD nAddins; - FREERDP_ADDIN* pAddin; + FREERDP_ADDIN* pAddin = NULL; FREERDP_ADDIN** ppAddins = NULL; STATIC_SUBSYSTEM_ENTRY* subsystems; nAddins = 0; - ppAddins = (FREERDP_ADDIN**) malloc(sizeof(FREERDP_ADDIN*) * 128); + ppAddins = (FREERDP_ADDIN**) calloc(1, sizeof(FREERDP_ADDIN*) * 128); + if (!ppAddins) + { + WLog_ERR(TAG, "calloc failed!"); + return NULL; + } + ppAddins[nAddins] = NULL; for (i = 0; CLIENT_STATIC_ADDIN_TABLE[i].name != NULL; i++) { - pAddin = (FREERDP_ADDIN*) malloc(sizeof(FREERDP_ADDIN)); - ZeroMemory(pAddin, sizeof(FREERDP_ADDIN)); + pAddin = (FREERDP_ADDIN*) calloc(1, sizeof(FREERDP_ADDIN)); + if (!pAddin) + { + WLog_ERR(TAG, "calloc failed!"); + goto error_out; + } strcpy(pAddin->cName, CLIENT_STATIC_ADDIN_TABLE[i].name); @@ -108,8 +123,12 @@ FREERDP_ADDIN** freerdp_channels_list_client_static_addins(LPSTR pszName, LPSTR for (j = 0; subsystems[j].name != NULL; j++) { - pAddin = (FREERDP_ADDIN*) malloc(sizeof(FREERDP_ADDIN)); - ZeroMemory(pAddin, sizeof(FREERDP_ADDIN)); + pAddin = (FREERDP_ADDIN*) calloc(1, sizeof(FREERDP_ADDIN)); + if (!pAddin) + { + WLog_ERR(TAG, "calloc failed!"); + goto error_out; + } strcpy(pAddin->cName, CLIENT_STATIC_ADDIN_TABLE[i].name); strcpy(pAddin->cSubsystem, subsystems[j].name); @@ -123,9 +142,10 @@ FREERDP_ADDIN** freerdp_channels_list_client_static_addins(LPSTR pszName, LPSTR } } - ppAddins[nAddins] = NULL; - return ppAddins; +error_out: + freerdp_channels_addin_list_free(ppAddins); + return NULL; } FREERDP_ADDIN** freerdp_channels_list_dynamic_addins(LPSTR pszName, LPSTR pszSubsystem, LPSTR pszType, DWORD dwFlags) @@ -153,6 +173,11 @@ FREERDP_ADDIN** freerdp_channels_list_dynamic_addins(LPSTR pszName, LPSTR pszSub cchPattern = 128 + strlen(pszExtension) + 2; pszPattern = (LPSTR) malloc(cchPattern + 1); + if (!pszPattern) + { + WLog_ERR(TAG, "malloc failed!"); + return NULL; + } if (pszName && pszSubsystem && pszType) { @@ -179,6 +204,12 @@ FREERDP_ADDIN** freerdp_channels_list_dynamic_addins(LPSTR pszName, LPSTR pszSub cchSearchPath = cchInstallPrefix + cchAddinPath + cchPattern + 3; pszSearchPath = (LPSTR) malloc(cchSearchPath + 1); + if (!pszSearchPath) + { + WLog_ERR(TAG, "malloc failed!"); + free(pszPattern); + return NULL; + } CopyMemory(pszSearchPath, pszInstallPrefix, cchInstallPrefix); pszSearchPath[cchInstallPrefix] = '\0'; @@ -195,8 +226,12 @@ FREERDP_ADDIN** freerdp_channels_list_dynamic_addins(LPSTR pszName, LPSTR pszSub free(pszSearchPath); nAddins = 0; - ppAddins = (FREERDP_ADDIN**) malloc(sizeof(FREERDP_ADDIN*) * 128); - ppAddins[nAddins] = NULL; + ppAddins = (FREERDP_ADDIN**) calloc(1, sizeof(FREERDP_ADDIN*) * 128); + if (!ppAddins) + { + WLog_ERR(TAG, "calloc failed!"); + return NULL; + } if (hFind == INVALID_HANDLE_VALUE) return ppAddins; @@ -207,8 +242,12 @@ FREERDP_ADDIN** freerdp_channels_list_dynamic_addins(LPSTR pszName, LPSTR pszSub FREERDP_ADDIN* pAddin; nDashes = 0; - pAddin = (FREERDP_ADDIN*) malloc(sizeof(FREERDP_ADDIN)); - ZeroMemory(pAddin, sizeof(FREERDP_ADDIN)); + pAddin = (FREERDP_ADDIN*) calloc(1, sizeof(FREERDP_ADDIN)); + if (!pAddin) + { + WLog_ERR(TAG, "calloc failed!"); + goto error_out; + } for (index = 0; FindData.cFileName[index]; index++) nDashes += (FindData.cFileName[index] == '-') ? 1 : 0; @@ -281,6 +320,9 @@ FREERDP_ADDIN** freerdp_channels_list_dynamic_addins(LPSTR pszName, LPSTR pszSub ppAddins[nAddins] = NULL; return ppAddins; +error_out: + freerdp_channels_addin_list_free(ppAddins); + return NULL; } FREERDP_ADDIN** freerdp_channels_list_addins(LPSTR pszName, LPSTR pszSubsystem, LPSTR pszType, DWORD dwFlags) @@ -297,6 +339,9 @@ void freerdp_channels_addin_list_free(FREERDP_ADDIN** ppAddins) { int index; + if (!ppAddins) + return; + for (index = 0; ppAddins[index] != NULL; index++) free(ppAddins[index]);