diff options
author | Manuel Stoeckl <code@mstoeckl.com> | 2021-02-02 00:20:15 -0500 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2021-05-10 10:57:58 +0200 |
commit | 31b4b96ebf2af88630752d8518fd360ff84cf3e5 (patch) | |
tree | d90996ca1c6f42c8ca9482553484ce23b7a6ff4e | |
parent | cmd_fullscreen: ignore fullscreen request on workspaces (diff) | |
download | sway-31b4b96ebf2af88630752d8518fd360ff84cf3e5.tar.gz sway-31b4b96ebf2af88630752d8518fd360ff84cf3e5.tar.zst sway-31b4b96ebf2af88630752d8518fd360ff84cf3e5.zip |
commands/exec: stop truncating >4095-byte commands
-rw-r--r-- | sway/commands/exec_always.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/sway/commands/exec_always.c b/sway/commands/exec_always.c index 781c86c9..e18e2c22 100644 --- a/sway/commands/exec_always.c +++ b/sway/commands/exec_always.c | |||
@@ -26,7 +26,7 @@ struct cmd_results *cmd_exec_validate(int argc, char **argv) { | |||
26 | 26 | ||
27 | struct cmd_results *cmd_exec_process(int argc, char **argv) { | 27 | struct cmd_results *cmd_exec_process(int argc, char **argv) { |
28 | struct cmd_results *error = NULL; | 28 | struct cmd_results *error = NULL; |
29 | char *tmp = NULL; | 29 | char *cmd = NULL; |
30 | if (strcmp(argv[0], "--no-startup-id") == 0) { | 30 | if (strcmp(argv[0], "--no-startup-id") == 0) { |
31 | sway_log(SWAY_INFO, "exec switch '--no-startup-id' not supported, ignored."); | 31 | sway_log(SWAY_INFO, "exec switch '--no-startup-id' not supported, ignored."); |
32 | --argc; ++argv; | 32 | --argc; ++argv; |
@@ -36,17 +36,12 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { | |||
36 | } | 36 | } |
37 | 37 | ||
38 | if (argc == 1 && (argv[0][0] == '\'' || argv[0][0] == '"')) { | 38 | if (argc == 1 && (argv[0][0] == '\'' || argv[0][0] == '"')) { |
39 | tmp = strdup(argv[0]); | 39 | cmd = strdup(argv[0]); |
40 | strip_quotes(tmp); | 40 | strip_quotes(cmd); |
41 | } else { | 41 | } else { |
42 | tmp = join_args(argv, argc); | 42 | cmd = join_args(argv, argc); |
43 | } | 43 | } |
44 | 44 | ||
45 | // Put argument into cmd array | ||
46 | char cmd[4096]; | ||
47 | strncpy(cmd, tmp, sizeof(cmd) - 1); | ||
48 | cmd[sizeof(cmd) - 1] = 0; | ||
49 | free(tmp); | ||
50 | sway_log(SWAY_DEBUG, "Executing %s", cmd); | 45 | sway_log(SWAY_DEBUG, "Executing %s", cmd); |
51 | 46 | ||
52 | int fd[2]; | 47 | int fd[2]; |
@@ -76,10 +71,12 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) { | |||
76 | close(fd[1]); | 71 | close(fd[1]); |
77 | _exit(0); // Close child process | 72 | _exit(0); // Close child process |
78 | } else if (pid < 0) { | 73 | } else if (pid < 0) { |
74 | free(cmd); | ||
79 | close(fd[0]); | 75 | close(fd[0]); |
80 | close(fd[1]); | 76 | close(fd[1]); |
81 | return cmd_results_new(CMD_FAILURE, "fork() failed"); | 77 | return cmd_results_new(CMD_FAILURE, "fork() failed"); |
82 | } | 78 | } |
79 | free(cmd); | ||
83 | close(fd[1]); // close write | 80 | close(fd[1]); // close write |
84 | ssize_t s = 0; | 81 | ssize_t s = 0; |
85 | while ((size_t)s < sizeof(pid_t)) { | 82 | while ((size_t)s < sizeof(pid_t)) { |