From 21127ec33b72c06d94bcad3ec4d5f3e1c4edf3aa Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 10 Sep 2013 10:29:45 +0200 Subject: [PATCH] Added a new flag to indicate the presence of a single not escaped argument allowing the legacy command line : syntax. --- client/common/compatibility.c | 2 ++ winpr/include/winpr/cmdline.h | 1 + winpr/libwinpr/utils/cmdline.c | 16 +++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/client/common/compatibility.c b/client/common/compatibility.c index e5f21b0..89db353 100644 --- a/client/common/compatibility.c +++ b/client/common/compatibility.c @@ -302,6 +302,7 @@ int freerdp_detect_old_command_line_syntax(int argc, char** argv, int* count) detect_status = 0; flags = COMMAND_LINE_SEPARATOR_SPACE; flags |= COMMAND_LINE_SIGIL_DASH | COMMAND_LINE_SIGIL_DOUBLE_DASH; + flags |= COMMAND_LINE_SIGIL_NOT_ESCAPED; settings = (rdpSettings*) malloc(sizeof(rdpSettings)); ZeroMemory(settings, sizeof(rdpSettings)); @@ -372,6 +373,7 @@ int freerdp_client_parse_old_command_line_arguments(int argc, char** argv, rdpSe flags = COMMAND_LINE_SEPARATOR_SPACE; flags |= COMMAND_LINE_SIGIL_DASH | COMMAND_LINE_SIGIL_DOUBLE_DASH; flags |= COMMAND_LINE_SIGIL_ENABLE_DISABLE; + flags |= COMMAND_LINE_SIGIL_NOT_ESCAPED; status = CommandLineParseArgumentsA(argc, (const char**) argv, old_args, flags, settings, freerdp_client_old_command_line_pre_filter, freerdp_client_old_command_line_post_filter); diff --git a/winpr/include/winpr/cmdline.h b/winpr/include/winpr/cmdline.h index bc67d4f..ca7ae72 100644 --- a/winpr/include/winpr/cmdline.h +++ b/winpr/include/winpr/cmdline.h @@ -53,6 +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_SEPARATOR_COLON 0x00000100 #define COMMAND_LINE_SEPARATOR_EQUAL 0x00000200 diff --git a/winpr/libwinpr/utils/cmdline.c b/winpr/libwinpr/utils/cmdline.c index 4e66ec9..1e6c450 100644 --- a/winpr/libwinpr/utils/cmdline.c +++ b/winpr/libwinpr/utils/cmdline.c @@ -54,6 +54,7 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* int length; int index; BOOL match, found, argument = FALSE; + BOOL notescaped = FALSE; char* sigil; int sigil_length; int sigil_index; @@ -81,6 +82,7 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* for (i = 1; i < argc; i++) { + BOOL escaped = TRUE; index = i; if (preFilter) @@ -130,12 +132,21 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* { sigil_length = 0; } + else if (flags & COMMAND_LINE_SIGIL_NOT_ESCAPED) + { + if (notescaped) + return COMMAND_LINE_ERROR; + sigil_length = 0; + escaped = FALSE; + notescaped = TRUE; + } else { return COMMAND_LINE_ERROR; } - if ((sigil_length > 0) || (flags & COMMAND_LINE_SIGIL_NONE)) + if ((sigil_length > 0) || (flags & COMMAND_LINE_SIGIL_NONE) || + (flags & COMMAND_LINE_SIGIL_NOT_ESCAPED)) { if (length < (sigil_length + 1)) return COMMAND_LINE_ERROR_NO_KEYWORD; @@ -191,6 +202,9 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* value_length = 0; } + if (!escaped) + continue; + found = FALSE; for (j = 0; options[j].Name != NULL; j++) { -- 2.7.4