mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-10-16 08:51:45 +00:00
AppRun v2.0.0, which appimage-builder downloads, copies each argument into a 1 KiB stack buffer in apprun_shell_split_arguments, so any argument of 1024 bytes or more aborts the AppImage with "buffer overflow detected" before RustDesk starts (e.g. --connect with a 10000-char id). Build AppRun from the v2.0.0 commit with a patch that sizes the buffer from the input and stops the quote/escape scanning at the terminating NUL, in ubuntu:16.04 like upstream's release, and put it where appimage-builder looks before downloading. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
56 lines
1.3 KiB
Diff
56 lines
1.3 KiB
Diff
--- a/src/common/shell_utils.c
|
|
+++ b/src/common/shell_utils.c
|
|
@@ -201,7 +201,8 @@
|
|
|
|
const char *begin = str;
|
|
const char *end = str;
|
|
- char buffer[1024] = {0x0};
|
|
+ size_t buffer_size = strlen(str) + 1;
|
|
+ char *buffer = calloc(buffer_size, sizeof(char));
|
|
|
|
while (*begin != '\0') {
|
|
begin = apprun_string_consume_spaces(begin);
|
|
@@ -209,7 +210,7 @@
|
|
|
|
if (*begin == '\\') {
|
|
strncat(buffer, begin + 1, 1);
|
|
- end = begin + 2;
|
|
+ end = begin[1] != '\0' ? begin + 2 : begin + 1;
|
|
consumed = true;
|
|
}
|
|
|
|
@@ -218,7 +219,8 @@
|
|
strncat(buffer, begin + 1, end - begin - 1);
|
|
consumed = true;
|
|
|
|
- end++;
|
|
+ if (*end != '\0')
|
|
+ end++;
|
|
}
|
|
|
|
if (!consumed && *begin == '\"') {
|
|
@@ -226,7 +228,8 @@
|
|
strncat(buffer, begin + 1, end - begin - 1);
|
|
consumed = true;
|
|
|
|
- end++;
|
|
+ if (*end != '\0')
|
|
+ end++;
|
|
}
|
|
|
|
if (!consumed && *begin != '\'' && *begin != '\"' && *begin != '\\') {
|
|
@@ -240,11 +243,12 @@
|
|
split_count++;
|
|
}
|
|
|
|
- memset(buffer, 0, 1024);
|
|
+ memset(buffer, 0, buffer_size);
|
|
}
|
|
|
|
begin = end;
|
|
}
|
|
|
|
+ free(buffer);
|
|
return splits;
|
|
}
|