Browse Source

Windows process: escape backslashes before quotes

Semphris 10 tháng trước cách đây
mục cha
commit
3cf54675bb
2 tập tin đã thay đổi với 13 bổ sung0 xóa
  1. 10 0
      src/process/windows/SDL_windowsprocess.c
  2. 3 0
      test/testprocess.c

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