cmd line: add missing checks
authorBernhard Miklautz <bernhard.miklautz@thincast.com>
Thu, 18 Jun 2015 11:00:10 +0000 (13:00 +0200)
committerBernhard Miklautz <bernhard.miklautz@thincast.com>
Mon, 22 Jun 2015 17:23:57 +0000 (19:23 +0200)
* strdup
* some allocs

client/common/cmdline.c
client/common/compatibility.c
include/freerdp/settings.h
libfreerdp/common/settings.c
winpr/include/winpr/cmdline.h

index d80a0c5..8182dd6 100644 (file)
@@ -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)
                {
index da2f483..1ec2790 100644 (file)
@@ -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")
index fbf9800..352a38d 100644 (file)
@@ -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);
index 7861c29..6d80012 100644 (file)
@@ -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)
index 48db262..ef41a6b 100644 (file)
 
 /* 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 */