Prechádzať zdrojové kódy

Windows process: escape backslashes before quotes

Semphris 7 mesiacov pred
rodič
commit
3cf54675bb

+ 10 - 0
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;

+ 3 - 0
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;