From 1b8dd139a91c2ca6f4f6201a67542dbfb1a9e99e Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Thu, 18 Jun 2015 13:00:10 +0200 Subject: [PATCH] cmd line: add missing checks * strdup * some allocs --- client/common/cmdline.c | 292 +++++++++++++++++++++++++++++++++--------- client/common/compatibility.c | 85 +++++++++--- include/freerdp/settings.h | 2 +- libfreerdp/common/settings.c | 7 +- winpr/include/winpr/cmdline.h | 5 +- 5 files changed, 308 insertions(+), 83 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index d80a0c5..8182dd6 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -216,6 +216,8 @@ int freerdp_client_print_command_line_help(int argc, char** argv) { length = (int)(strlen(arg->Name) + strlen(arg->Format) + 2); str = (char*) calloc(length + 1UL, sizeof(char)); + if (!str) + return -1; sprintf_s(str, length + 1, "%s:%s", arg->Name, arg->Format); printf("%-20s", str); free(str); @@ -231,6 +233,8 @@ int freerdp_client_print_command_line_help(int argc, char** argv) { length = (int) strlen(arg->Name) + 32; str = (char*) calloc(length + 1UL, sizeof(char)); + if (!str) + return -1; sprintf_s(str, length + 1, "%s (default:%s)", arg->Name, arg->Default ? "on" : "off"); @@ -292,7 +296,8 @@ int freerdp_client_command_line_pre_filter(void* context, int index, int argc, L if (_stricmp(&(argv[index])[length - 4], ".rdp") == 0) { settings = (rdpSettings*) context; - settings->ConnectionFile = _strdup(argv[index]); + if (!(settings->ConnectionFile = _strdup(argv[index]))) + return COMMAND_LINE_ERROR_MEMORY; return 1; } @@ -303,7 +308,8 @@ int freerdp_client_command_line_pre_filter(void* context, int index, int argc, L if (_stricmp(&(argv[index])[length - 13], ".msrcIncident") == 0) { settings = (rdpSettings*) context; - settings->AssistanceFile = _strdup(argv[index]); + if (!(settings->AssistanceFile = _strdup(argv[index]))) + return COMMAND_LINE_ERROR_MEMORY; return 1; } @@ -332,12 +338,31 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p drive->Type = RDPDR_DTYP_FILESYSTEM; if (count > 1) - drive->Name = _strdup(params[1]); + { + if (!(drive->Name = _strdup(params[1]))) + { + free(drive); + return -1; + } + } if (count > 2) - drive->Path = _strdup(params[2]); + { + if (!(drive->Path = _strdup(params[2]))) + { + free(drive->Name); + free(drive); + return -1; + } + } - freerdp_device_collection_add(settings, (RDPDR_DEVICE*) drive); + if (!freerdp_device_collection_add(settings, (RDPDR_DEVICE*) drive)) + { + free(drive->Path); + free(drive->Name); + free(drive); + return -1; + } return 1; } @@ -361,12 +386,33 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p printer->Type = RDPDR_DTYP_PRINT; if (count > 1) - printer->Name = _strdup(params[1]); + { + if (!(printer->Name = _strdup(params[1]))) + { + free(printer); + return -1; + } + } if (count > 2) - printer->DriverName = _strdup(params[2]); + { + if (!(printer->DriverName = _strdup(params[2]))) + { + free(printer->Name); + free(printer); + return -1; + } + } + + + if (!freerdp_device_collection_add(settings, (RDPDR_DEVICE*) printer)) + { + free(printer->DriverName); + free(printer->Name); + free(printer); + return -1; + } - freerdp_device_collection_add(settings, (RDPDR_DEVICE*) printer); } return 1; @@ -391,12 +437,30 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p smartcard->Type = RDPDR_DTYP_SMARTCARD; if (count > 1) - smartcard->Name = _strdup(params[1]); + { + if (!(smartcard->Name = _strdup(params[1]))) + { + free(smartcard); + return -1; + } + } if (count > 2) - smartcard->Path = _strdup(params[2]); - - freerdp_device_collection_add(settings, (RDPDR_DEVICE*) smartcard); + { + if (!(smartcard->Path = _strdup(params[2]))) + { + free(smartcard->Name); + free(smartcard); + return -1; + } + } + if (!freerdp_device_collection_add(settings, (RDPDR_DEVICE*) smartcard)) + { + free(smartcard->Path); + free(smartcard->Name); + free(smartcard); + return -1; + } } return 1; @@ -419,18 +483,56 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p serial->Type = RDPDR_DTYP_SERIAL; if (count > 1) - serial->Name = _strdup(params[1]); + { + if (!(serial->Name = _strdup(params[1]))) + { + free(serial); + return -1; + } + } if (count > 2) - serial->Path = _strdup(params[2]); + { + if (!(serial->Path = _strdup(params[2]))) + { + free(serial->Name); + free(serial); + return -1; + } + } if (count > 3) - serial->Driver = _strdup(params[3]); + { + if (!(serial->Driver = _strdup(params[3]))) + { + free(serial->Path); + free(serial->Name); + free(serial); + return -1; + } + } if (count > 4) - serial->Permissive = _strdup(params[4]); + { + if (!(serial->Permissive = _strdup(params[4]))) + { + free(serial->Driver); + free(serial->Path); + free(serial->Name); + free(serial); + return -1; + } + } - freerdp_device_collection_add(settings, (RDPDR_DEVICE*) serial); + if (!freerdp_device_collection_add(settings, (RDPDR_DEVICE*) serial)) + { + free(serial->Permissive); + free(serial->Driver); + free(serial->Path); + free(serial->Name); + free(serial); + return -1; + } return 1; } @@ -452,12 +554,31 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p parallel->Type = RDPDR_DTYP_PARALLEL; if (count > 1) - parallel->Name = _strdup(params[1]); + { + if (!(parallel->Name = _strdup(params[1]))) + { + free(parallel); + return -1; + } + } if (count > 2) - parallel->Path = _strdup(params[2]); + { + if (!(parallel->Path = _strdup(params[2]))) + { + free(parallel->Name); + free(parallel); + return -1; + } + } - freerdp_device_collection_add(settings, (RDPDR_DEVICE*) parallel); + if (!freerdp_device_collection_add(settings, (RDPDR_DEVICE*) parallel)) + { + free(parallel->Path); + free(parallel->Name); + free(parallel); + return -1; + } return 1; } @@ -470,7 +591,7 @@ int freerdp_client_add_static_channel(rdpSettings* settings, int count, char** p int index; ADDIN_ARGV* args; - args = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV)); + args = (ADDIN_ARGV*) calloc(1, sizeof(ADDIN_ARGV)); if (!args) return -1; @@ -483,7 +604,12 @@ int freerdp_client_add_static_channel(rdpSettings* settings, int count, char** p { args->argv[index] = _strdup(params[index]); if (!args->argv[index]) - goto error_argv_index; + { + for (--index; index >= 0; --index) + free(args->argv[index]); + + goto error_argv_strdup; + } } if (!freerdp_static_channel_collection_add(settings, args)) @@ -494,6 +620,7 @@ int freerdp_client_add_static_channel(rdpSettings* settings, int count, char** p error_argv_index: for (index = 0; index < args->argc; index++) free(args->argv[index]); +error_argv_strdup: free(args->argv); error_argv: free(args); @@ -518,7 +645,12 @@ int freerdp_client_add_dynamic_channel(rdpSettings* settings, int count, char** { args->argv[index] = _strdup(params[index]); if (!args->argv[index]) - goto error_argv_index; + { + for (--index; index >= 0; --index) + free(args->argv[index]); + + goto error_argv_strdup; + } } if (!freerdp_dynamic_channel_collection_add(settings, args)) @@ -529,6 +661,7 @@ int freerdp_client_add_dynamic_channel(rdpSettings* settings, int count, char** error_argv_index: for (index = 0; index < args->argc; index++) free(args->argv[index]); +error_argv_strdup: free(args->argv); error_argv: free(args); @@ -556,6 +689,8 @@ static char** freerdp_command_line_parse_comma_separated_values(char* list, int* nArgs = nCommas + 1; p = (char**) calloc((nArgs + 1UL), sizeof(char*)); + if (!p) + return NULL; str = (char*) list; @@ -1326,13 +1461,16 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, { length = (int) (p - arg->Value); settings->ServerPort = atoi(&p[1]); - settings->ServerHostname = (char*) calloc(length + 1UL, sizeof(char)); + if (!(settings->ServerHostname = (char*) calloc(length + 1UL, sizeof(char)))) + return COMMAND_LINE_ERROR_MEMORY; + strncpy(settings->ServerHostname, arg->Value, length); settings->ServerHostname[length] = '\0'; } else { - settings->ServerHostname = _strdup(arg->Value); + if (!(settings->ServerHostname = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } } else /* ipv6 */ @@ -1343,7 +1481,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, continue; length = p2 - p; - settings->ServerHostname = (char*) calloc(length, sizeof(char)); + if (!(settings->ServerHostname = (char*) calloc(length, sizeof(char)))) + return COMMAND_LINE_ERROR; strncpy(settings->ServerHostname, p+1, length-1); if (*(p2 + 1) == ':') { @@ -1354,7 +1493,9 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "spn-class") { - settings->AuthenticationServiceClass = _strdup(arg->Value); + if (!(settings->AuthenticationServiceClass = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; + } CommandLineSwitchCase(arg, "credentials-delegation") { @@ -1368,7 +1509,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { settings->SendPreconnectionPdu = TRUE; - settings->PreconnectionBlob = _strdup(arg->Value); + if (!(settings->PreconnectionBlob = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } } CommandLineSwitchCase(arg, "w") @@ -1381,7 +1523,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "size") { - str = _strdup(arg->Value); + if (!(str = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; p = strchr(str, 'x'); @@ -1435,6 +1578,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, int count = 0; p = freerdp_command_line_parse_comma_separated_values(arg->Value, &count); + if (!p) + return COMMAND_LINE_ERROR_MEMORY; if (count > 16) count = 16; @@ -1455,7 +1600,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "t") { - settings->WindowTitle = _strdup(arg->Value); + if (!(settings->WindowTitle = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "decorations") { @@ -1467,7 +1613,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (arg->Value) { - str = _strdup(arg->Value); + if (!(str = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; if ((p = strchr(str, 'x'))) { *p = '\0'; @@ -1494,11 +1641,13 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, { settings->ConsoleSession = TRUE; settings->RestrictedAdminModeRequired = TRUE; - settings->PasswordHash = _strdup(arg->Value); + if (!(settings->PasswordHash = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "client-hostname") { - settings->ClientHostname = _strdup(arg->Value); + if (!(settings->ClientHostname = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "kbd") { @@ -1544,11 +1693,13 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "d") { - settings->Domain = _strdup(arg->Value); + if (!(settings->Domain = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "p") { - settings->Password = _strdup(arg->Value); + if (!(settings->Password = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "g") { @@ -1560,18 +1711,21 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, { length = (int) (p - arg->Value); settings->GatewayPort = atoi(&p[1]); - settings->GatewayHostname = (char*) calloc(length + 1UL, sizeof(char)); + if (!(settings->GatewayHostname = (char*) calloc(length + 1UL, sizeof(char)))) + return COMMAND_LINE_ERROR_MEMORY; strncpy(settings->GatewayHostname, arg->Value, length); settings->GatewayHostname[length] = '\0'; } else { - settings->GatewayHostname = _strdup(arg->Value); + if (!(settings->GatewayHostname = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } } else { - settings->GatewayHostname = _strdup(settings->ServerHostname); + if (!(settings->GatewayHostname = _strdup(settings->ServerHostname))) + return COMMAND_LINE_ERROR_MEMORY; } settings->GatewayEnabled = TRUE; @@ -1581,17 +1735,21 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "gu") { - gwUser = _strdup(arg->Value); + if (!(gwUser = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; + settings->GatewayUseSameCredentials = FALSE; } CommandLineSwitchCase(arg, "gd") { - settings->GatewayDomain = _strdup(arg->Value); + if (!(settings->GatewayDomain = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; settings->GatewayUseSameCredentials = FALSE; } CommandLineSwitchCase(arg, "gp") { - settings->GatewayPassword = _strdup(arg->Value); + if (!(settings->GatewayPassword = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; settings->GatewayUseSameCredentials = FALSE; } CommandLineSwitchCase(arg, "gt") @@ -1635,7 +1793,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "app") { - settings->RemoteApplicationProgram = _strdup(arg->Value); + if (!(settings->RemoteApplicationProgram = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; settings->RemoteApplicationMode = TRUE; settings->RemoteAppLanguageBarSupported = TRUE; @@ -1645,28 +1804,35 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "load-balance-info") { - settings->LoadBalanceInfo = (BYTE*) _strdup(arg->Value); + if (!(settings->LoadBalanceInfo = (BYTE*) _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; settings->LoadBalanceInfoLength = (UINT32) strlen((char*) settings->LoadBalanceInfo); } CommandLineSwitchCase(arg, "app-name") { - settings->RemoteApplicationName = _strdup(arg->Value); + if (!(settings->RemoteApplicationName = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; + } CommandLineSwitchCase(arg, "app-icon") { - settings->RemoteApplicationIcon = _strdup(arg->Value); + if (!(settings->RemoteApplicationIcon = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "app-cmd") { - settings->RemoteApplicationCmdLine = _strdup(arg->Value); + if (!(settings->RemoteApplicationCmdLine = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "app-file") { - settings->RemoteApplicationFile = _strdup(arg->Value); + if (!(settings->RemoteApplicationFile = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "app-guid") { - settings->RemoteApplicationGuid = _strdup(arg->Value); + if (!(settings->RemoteApplicationGuid = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "compression") { @@ -1690,11 +1856,13 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "shell") { - settings->AlternateShell = _strdup(arg->Value); + if (!(settings->AlternateShell = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "shell-dir") { - settings->ShellWorkingDirectory = _strdup(arg->Value); + if (!(settings->ShellWorkingDirectory = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "audio-mode") { @@ -1846,7 +2014,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, CommandLineSwitchCase(arg, "pcb") { settings->SendPreconnectionPdu = TRUE; - settings->PreconnectionBlob = _strdup(arg->Value); + if (!(settings->PreconnectionBlob = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "pcid") { @@ -1936,20 +2105,24 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, { if (strcmp(arg->Value, "netmon") == 0) { - settings->AllowedTlsCiphers = _strdup("ALL:!ECDH"); + if (!(settings->AllowedTlsCiphers = _strdup("ALL:!ECDH"))) + return COMMAND_LINE_ERROR_MEMORY; } else if (strcmp(arg->Value, "ma") == 0) { - settings->AllowedTlsCiphers = _strdup("AES128-SHA"); + if (!(settings->AllowedTlsCiphers = _strdup("AES128-SHA"))) + return COMMAND_LINE_ERROR_MEMORY; } else { - settings->AllowedTlsCiphers = _strdup(arg->Value); + if (!(settings->AllowedTlsCiphers = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } } CommandLineSwitchCase(arg, "cert-name") { - settings->CertificateName = _strdup(arg->Value); + if (!(settings->CertificateName = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "cert-ignore") { @@ -2038,11 +2211,13 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "wm-class") { - settings->WmClass = _strdup(arg->Value); + if (!(settings->WmClass = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "play-rfx") { - settings->PlayRemoteFxFile = _strdup(arg->Value); + if (!(settings->PlayRemoteFxFile = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; settings->PlayRemoteFx = TRUE; } CommandLineSwitchCase(arg, "auth-only") @@ -2076,7 +2251,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, CommandLineSwitchCase(arg, "assistance") { settings->RemoteAssistanceMode = TRUE; - settings->RemoteAssistancePassword = _strdup(arg->Value); + if (!(settings->RemoteAssistancePassword = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchDefault(arg) { diff --git a/client/common/compatibility.c b/client/common/compatibility.c index da2f483..1ec2790 100644 --- a/client/common/compatibility.c +++ b/client/common/compatibility.c @@ -89,7 +89,7 @@ COMMAND_LINE_ARGUMENT_A old_args[] = { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL } }; -void freerdp_client_old_parse_hostname(char* str, char** ServerHostname, UINT32* ServerPort) +BOOL freerdp_client_old_parse_hostname(char* str, char** ServerHostname, UINT32* ServerPort) { char* p; @@ -97,7 +97,8 @@ void freerdp_client_old_parse_hostname(char* str, char** ServerHostname, UINT32* && (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':')))) { /* Either "[...]" or "[...]:..." with at most one : after the brackets */ - *ServerHostname = _strdup(str + 1); + if (!(*ServerHostname = _strdup(str + 1))) + return FALSE; if ((p = strchr((char*) *ServerHostname, ']'))) { @@ -110,7 +111,8 @@ void freerdp_client_old_parse_hostname(char* str, char** ServerHostname, UINT32* else { /* Port number is cut off and used if exactly one : in the string */ - *ServerHostname = _strdup(str); + if (!(*ServerHostname = _strdup(str))) + return FALSE; if ((p = strchr((char*) *ServerHostname, ':')) && !strchr(p + 1, ':')) { @@ -118,6 +120,7 @@ void freerdp_client_old_parse_hostname(char* str, char** ServerHostname, UINT32* *ServerPort = atoi(p + 1); } } + return TRUE; } int freerdp_client_old_process_plugin(rdpSettings* settings, ADDIN_ARGV* args) @@ -183,7 +186,8 @@ int freerdp_client_old_process_plugin(rdpSettings* settings, ADDIN_ARGV* args) return 1; args_handled++; - settings->RemoteApplicationProgram = _strdup(args->argv[1]); + if (!(settings->RemoteApplicationProgram = _strdup(args->argv[1]))) + return -1; } else { @@ -211,8 +215,9 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg return -1; } - freerdp_client_old_parse_hostname((char*) argv[index], - &settings->ServerHostname, &settings->ServerPort); + if (!freerdp_client_old_parse_hostname((char*) argv[index], + &settings->ServerHostname, &settings->ServerPort)) + return -1; return 2; } @@ -240,7 +245,14 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg return -1; args = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV)); + if (!args) + return -1; args->argv = (char**) calloc(argc, sizeof(char*)); + if (!args->argv) + { + free(args); + return -1; + } args->argc = 1; if ((index < argc - 1) && strcmp("--data", argv[index + 1]) == 0) @@ -250,9 +262,14 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg while ((index < argc) && (strcmp("--", argv[index]) != 0)) { - args_handled ++; + args_handled++; args->argc = 1; - args->argv[0] = _strdup(argv[t]); + if (!(args->argv[0] = _strdup(argv[t]))) + { + free(args->argv); + free(args); + return -1; + } for (j = 0, p = (char*) argv[index]; (j < 4) && (p != NULL); j++) { @@ -277,14 +294,31 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg if (p != NULL) { length = (int) (p - a); - args->argv[j + 1] = (char*) malloc(length + 1); + if (!(args->argv[j + 1] = (char*) malloc(length + 1))) + { + for (; j >= 0; --j) + free(args->argv[j]); + + free(args->argv); + free(args); + return -1; + } CopyMemory(args->argv[j + 1], a, length); args->argv[j + 1][length] = '\0'; p++; } else { - args->argv[j + 1] = _strdup(a); + if (!(args->argv[j + 1] = _strdup(a))) + { + for (; j >= 0; --j) + free(args->argv[j]); + + free(args->argv); + free(args); + return -1; + + } } args->argc++; @@ -306,7 +340,12 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg { if (settings) { - args->argv[0] = _strdup(argv[t]); + if (!(args->argv[0] = _strdup(argv[t]))) + { + free(args->argv); + free(args); + return -1; + } args_handled = freerdp_client_old_process_plugin(settings, args); free (args->argv[0]); } @@ -459,8 +498,9 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "c") { - settings->ShellWorkingDirectory = _strdup(arg->Value); WLog_WARN(TAG, "-c %s -> /shell-dir:%s", arg->Value, arg->Value); + if (!(settings->ShellWorkingDirectory = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; } CommandLineSwitchCase(arg, "D") { @@ -469,12 +509,14 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "T") { - settings->WindowTitle = _strdup(arg->Value); + if (!(settings->WindowTitle = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; WLog_WARN(TAG, "-T %s -> /title:%s", arg->Value, arg->Value); } CommandLineSwitchCase(arg, "d") { - settings->Domain = _strdup(arg->Value); + if (!(settings->Domain = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; WLog_WARN(TAG, "-d %s -> /d:%s", arg->Value, arg->Value); } CommandLineSwitchCase(arg, "f") @@ -484,7 +526,8 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "g") { - str = _strdup(arg->Value); + if (!(str = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; p = strchr(str, 'x'); @@ -511,7 +554,8 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "n") { - settings->ClientHostname = _strdup(arg->Value); + if (!(settings->ClientHostname = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; WLog_WARN(TAG, "-n -> /client-hostname:%s", arg->Value); } CommandLineSwitchCase(arg, "o") @@ -521,14 +565,16 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "p") { - settings->Password = _strdup(arg->Value); + if (!(settings->Password = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; WLog_WARN(TAG, "-p ****** -> /p:******"); /* Hide the value from 'ps'. */ FillMemory(arg->Value, strlen(arg->Value), '*'); } CommandLineSwitchCase(arg, "s") { - settings->AlternateShell = _strdup(arg->Value); + if (!(settings->AlternateShell = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; WLog_WARN(TAG, "-s %s -> /shell:%s", arg->Value, arg->Value); } CommandLineSwitchCase(arg, "t") @@ -538,7 +584,8 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe } CommandLineSwitchCase(arg, "u") { - settings->Username = _strdup(arg->Value); + if (!(settings->Username = _strdup(arg->Value))) + return COMMAND_LINE_ERROR_MEMORY; WLog_WARN(TAG, "-u %s -> /u:%s", arg->Value, arg->Value); } CommandLineSwitchCase(arg, "x") diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index fbf9800..352a38d 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -1435,7 +1435,7 @@ FREERDP_API int freerdp_addin_replace_argument(ADDIN_ARGV* args, char* previous, FREERDP_API int freerdp_addin_set_argument_value(ADDIN_ARGV* args, char* option, char* value); FREERDP_API int freerdp_addin_replace_argument_value(ADDIN_ARGV* args, char* previous, char* option, char* value); -FREERDP_API void freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device); +FREERDP_API BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device); FREERDP_API RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings, const char* name); FREERDP_API RDPDR_DEVICE* freerdp_device_clone(RDPDR_DEVICE* device); FREERDP_API void freerdp_device_collection_free(rdpSettings* settings); diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index 7861c29..6d80012 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -159,10 +159,10 @@ int freerdp_addin_replace_argument_value(ADDIN_ARGV* args, char* previous, char* return 0; } -void freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device) +BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device) { if (!settings->DeviceArray) - return; + return FALSE; if (settings->DeviceArraySize < (settings->DeviceCount + 1)) { @@ -173,12 +173,13 @@ void freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device) new_array = (RDPDR_DEVICE**) realloc(settings->DeviceArray, new_size * sizeof(RDPDR_DEVICE*)); if (!new_array) - return; + return FALSE; settings->DeviceArray = new_array; settings->DeviceArraySize = new_size; } settings->DeviceArray[settings->DeviceCount++] = device; + return TRUE; } RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings, const char* name) diff --git a/winpr/include/winpr/cmdline.h b/winpr/include/winpr/cmdline.h index 48db262..ef41a6b 100644 --- a/winpr/include/winpr/cmdline.h +++ b/winpr/include/winpr/cmdline.h @@ -64,13 +64,14 @@ /* Command-Line Parsing Error Codes */ -#define COMMAND_LINE_ERROR -1000 +#define COMMAND_LINE_ERROR -1000 #define COMMAND_LINE_ERROR_NO_KEYWORD -1001 #define COMMAND_LINE_ERROR_UNEXPECTED_VALUE -1002 #define COMMAND_LINE_ERROR_MISSING_VALUE -1003 #define COMMAND_LINE_ERROR_MISSING_ARGUMENT -1004 #define COMMAND_LINE_ERROR_UNEXPECTED_SIGIL -1005 -#define COMMAND_LINE_ERROR_LAST -1006 +#define COMMAND_LINE_ERROR_MEMORY -1006 +#define COMMAND_LINE_ERROR_LAST -1999 /* Command-Line Parsing Status Codes */ -- 2.7.4