{
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);
{
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");
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;
}
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;
}
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;
}
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;
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;
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;
}
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;
}
int index;
ADDIN_ARGV* args;
- args = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV));
+ args = (ADDIN_ARGV*) calloc(1, sizeof(ADDIN_ARGV));
if (!args)
return -1;
{
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))
error_argv_index:
for (index = 0; index < args->argc; index++)
free(args->argv[index]);
+error_argv_strdup:
free(args->argv);
error_argv:
free(args);
{
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))
error_argv_index:
for (index = 0; index < args->argc; index++)
free(args->argv[index]);
+error_argv_strdup:
free(args->argv);
error_argv:
free(args);
nArgs = nCommas + 1;
p = (char**) calloc((nArgs + 1UL), sizeof(char*));
+ if (!p)
+ return NULL;
str = (char*) list;
{
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 */
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) == ':')
{
}
CommandLineSwitchCase(arg, "spn-class")
{
- settings->AuthenticationServiceClass = _strdup(arg->Value);
+ if (!(settings->AuthenticationServiceClass = _strdup(arg->Value)))
+ return COMMAND_LINE_ERROR_MEMORY;
+
}
CommandLineSwitchCase(arg, "credentials-delegation")
{
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")
}
CommandLineSwitchCase(arg, "size")
{
- str = _strdup(arg->Value);
+ if (!(str = _strdup(arg->Value)))
+ return COMMAND_LINE_ERROR_MEMORY;
p = strchr(str, 'x');
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;
}
CommandLineSwitchCase(arg, "t")
{
- settings->WindowTitle = _strdup(arg->Value);
+ if (!(settings->WindowTitle = _strdup(arg->Value)))
+ return COMMAND_LINE_ERROR_MEMORY;
}
CommandLineSwitchCase(arg, "decorations")
{
if (arg->Value)
{
- str = _strdup(arg->Value);
+ if (!(str = _strdup(arg->Value)))
+ return COMMAND_LINE_ERROR_MEMORY;
if ((p = strchr(str, 'x')))
{
*p = '\0';
{
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")
{
}
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")
{
{
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;
}
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")
}
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;
}
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")
{
}
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")
{
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")
{
{
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")
{
}
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")
CommandLineSwitchCase(arg, "assistance")
{
settings->RemoteAssistanceMode = TRUE;
- settings->RemoteAssistancePassword = _strdup(arg->Value);
+ if (!(settings->RemoteAssistancePassword = _strdup(arg->Value)))
+ return COMMAND_LINE_ERROR_MEMORY;
}
CommandLineSwitchDefault(arg)
{
{ 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;
&& (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, ']')))
{
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, ':'))
{
*ServerPort = atoi(p + 1);
}
}
+ return TRUE;
}
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
{
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;
}
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)
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++)
{
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++;
{
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]);
}
}
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")
{
}
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")
}
CommandLineSwitchCase(arg, "g")
{
- str = _strdup(arg->Value);
+ if (!(str = _strdup(arg->Value)))
+ return COMMAND_LINE_ERROR_MEMORY;
p = strchr(str, 'x');
}
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")
}
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")
}
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")