diff --git a/src/process/windows/SDL_windowsprocess.c b/src/process/windows/SDL_windowsprocess.c index 2ae13022a..721e61a0f 100644 --- a/src/process/windows/SDL_windowsprocess.c +++ b/src/process/windows/SDL_windowsprocess.c @@ -95,6 +95,10 @@ static bool join_arguments(const char * const *args, char **args_out) case '"': len += 2; break; + case '\\': + /* only escape backslashes that precede a double quote */ + len += (*(a + 1) == '"' || *(a + 1) == '\0') ? 2 : 1; + break; default: len += 1; break; @@ -121,6 +125,12 @@ static bool join_arguments(const char * const *args, char **args_out) result[i_out++] = '\\'; result[i_out++] = *a; break; + case '\\': + result[i_out++] = *a; + if (*(a + 1) == '"' || *(a + 1) == '\0') { + result[i_out++] = *a; + } + break; default: result[i_out++] = *a; break; diff --git a/test/testprocess.c b/test/testprocess.c index 9898e516a..6f59c5ad2 100644 --- a/test/testprocess.c +++ b/test/testprocess.c @@ -92,6 +92,9 @@ static int SDLCALL process_testArguments(void *arg) "'a' 'b' 'c'", "%d%%%s", "\\t\\c", + "evil\\", + "a\\b\"c\\", + "\"\\^&|<>%", /* characters with a special meaning */ NULL }; SDL_Process *process = NULL;