From fb23f08388441acaadacbc17adced95db2ae4e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 10 Nov 2013 13:29:20 -0500 Subject: [PATCH] libfreerdp-client: fix possible infinite loop with .rdp file parsing containing freerdp options --- client/common/cmdline.c | 3 +-- client/common/compatibility.c | 16 +++++++++++++--- client/common/file.c | 4 ++++ winpr/include/winpr/cmdline.h | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 2b75bbe13..baf4e6681 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -989,7 +989,7 @@ BOOL freerdp_client_detect_command_line(int argc, char** argv, DWORD* flags) *flags |= COMMAND_LINE_SIGIL_DASH | COMMAND_LINE_SIGIL_DOUBLE_DASH; *flags |= COMMAND_LINE_SIGIL_ENABLE_DISABLE; - if (windows_cli_count > posix_cli_count) + if (windows_cli_count >= posix_cli_count) { *flags = COMMAND_LINE_SEPARATOR_COLON; *flags |= COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SIGIL_PLUS_MINUS; @@ -1098,7 +1098,6 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, return status; } - arg = CommandLineFindArgumentA(args, "v"); arg = args; diff --git a/client/common/compatibility.c b/client/common/compatibility.c index 279706722..d0fcff5d5 100644 --- a/client/common/compatibility.c +++ b/client/common/compatibility.c @@ -199,7 +199,12 @@ 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 (settings) + { + freerdp_client_old_parse_hostname((char*) argv[index], + &settings->ServerHostname, &settings->ServerPort); + } } else { @@ -280,14 +285,19 @@ int freerdp_client_old_command_line_pre_filter(void* context, int index, int arg index++; i++; } - } else { + } + else + { + if (settings) + { if (settings->instance) { freerdp_client_old_process_plugin(settings, args); } + } } - for (i=0; iargc; i++) + for (i = 0; i < args->argc; i++) free(args->argv[i]); free(args->argv); free(args); diff --git a/client/common/file.c b/client/common/file.c index 0d993345e..de29527bf 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -976,7 +976,11 @@ BOOL freerdp_client_populate_settings_from_rdp_file(rdpFile* file, rdpSettings* if (file->argc > 1) { + char* ConnectionFile = settings->ConnectionFile; + + settings->ConnectionFile = NULL; freerdp_client_settings_parse_command_line(settings, file->argc, file->argv); + settings->ConnectionFile = ConnectionFile; } return TRUE; diff --git a/winpr/include/winpr/cmdline.h b/winpr/include/winpr/cmdline.h index ca7ae7292..1570ce9b4 100644 --- a/winpr/include/winpr/cmdline.h +++ b/winpr/include/winpr/cmdline.h @@ -53,7 +53,7 @@ #define COMMAND_LINE_SIGIL_DOUBLE_DASH 0x00000008 #define COMMAND_LINE_SIGIL_PLUS_MINUS 0x00000010 #define COMMAND_LINE_SIGIL_ENABLE_DISABLE 0x00000020 -#define COMMAND_LINE_SIGIL_NOT_ESCAPED 0x00000040 +#define COMMAND_LINE_SIGIL_NOT_ESCAPED 0x00000040 #define COMMAND_LINE_SEPARATOR_COLON 0x00000100 #define COMMAND_LINE_SEPARATOR_EQUAL 0x00000200