From 2f617c9e39bf23431d773726b5fb81b9c4c9bf57 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Wed, 9 Jul 2025 09:55:14 +0200 Subject: [PATCH] [client,common] Unescape /gateway option values To support escaped characters with /gateway all values are now unuescaped before use. --- client/common/cmdline.c | 43 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 84b66e905..ed1ac6ebe 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -4087,8 +4087,43 @@ static BOOL parse_gateway_usage_option(rdpSettings* settings, const char* value) return freerdp_set_gateway_usage_method(settings, type); } +static char* unescape(const char* str) +{ + char* copy = strdup(str); + if (!copy) + return NULL; + + bool escaped = false; + char* dst = copy; + while (*str != '\0') + { + char cur = *str++; + + switch (cur) + { + case '\\': + if (!escaped) + { + escaped = true; + continue; + } + // fallthrough + WINPR_FALLTHROUGH + default: + *dst++ = cur; + escaped = false; + break; + } + } + + *dst = '\0'; + + return copy; +} + static BOOL parse_gateway_options(rdpSettings* settings, const COMMAND_LINE_ARGUMENT_A* arg) { + char* argval = NULL; BOOL rc = FALSE; WINPR_ASSERT(settings); @@ -4107,9 +4142,10 @@ static BOOL parse_gateway_options(rdpSettings* settings, const COMMAND_LINE_ARGU for (size_t x = 0; x < count; x++) { BOOL validOption = FALSE; - const char* argval = ptr[x]; - - WINPR_ASSERT(argval); + free(argval); + argval = unescape(ptr[x]); + if (!argval) + goto fail; const char* gw = option_starts_with("g:", argval); if (gw) @@ -4216,6 +4252,7 @@ static BOOL parse_gateway_options(rdpSettings* settings, const COMMAND_LINE_ARGU rc = TRUE; fail: + free(argval); CommandLineParserFree(ptr); return rc; }