aboutsummaryrefslogtreecommitdiff
path: root/src/feature/control/control_cmd.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2019-04-02 10:41:12 -0400
committerNick Mathewson <nickm@torproject.org>2019-04-25 14:13:03 -0400
commitdbfe1a14e44647a4d5f27f8d495f3468208d75dd (patch)
tree019b889b40e0390898c3ae18ad4132926c4b4d91 /src/feature/control/control_cmd.c
parentf18b7dc4731bcb853db92a0faaa4ec03d6ef5586 (diff)
downloadtor-dbfe1a14e44647a4d5f27f8d495f3468208d75dd.tar.gz
tor-dbfe1a14e44647a4d5f27f8d495f3468208d75dd.zip
When parsing a multiline controller command, be careful with linebreaks
The first line break in particular was mishandled: it was discarded if no arguments came before it, which made it impossible to distinguish arguments from the first line of the body. To solve this, we need to allocate a copy of the command rather than using NUL to separate it, since we might have "COMMAND\n" as our input. Fixes ticket 29984.
Diffstat (limited to 'src/feature/control/control_cmd.c')
-rw-r--r--src/feature/control/control_cmd.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/feature/control/control_cmd.c b/src/feature/control/control_cmd.c
index aa0bef5135..53cbf2bd0f 100644
--- a/src/feature/control/control_cmd.c
+++ b/src/feature/control/control_cmd.c
@@ -2299,7 +2299,7 @@ handle_control_obsolete(control_connection_t *conn,
{
(void)arg_len;
(void)args;
- char *command = tor_strdup(conn->incoming_cmd);
+ char *command = tor_strdup(conn->current_cmd);
tor_strupper(command);
connection_printf_to_buf(conn, "511 %s is obsolete.\r\n", command);
tor_free(command);
@@ -2490,14 +2490,14 @@ handle_single_control_command(const control_cmd_def_t *def,
control_cmd_args_t *parsed_args;
char *err=NULL;
tor_assert(def->syntax);
- parsed_args = control_cmd_parse_args(conn->incoming_cmd,
+ parsed_args = control_cmd_parse_args(conn->current_cmd,
def->syntax,
cmd_data_len, args,
&err);
if (!parsed_args) {
connection_printf_to_buf(conn,
"512 Bad arguments to %s: %s\r\n",
- conn->incoming_cmd, err?err:"");
+ conn->current_cmd, err?err:"");
tor_free(err);
} else {
if (BUG(err))
@@ -2519,7 +2519,7 @@ handle_single_control_command(const control_cmd_def_t *def,
}
/**
- * Run a given controller command, as selected by the incoming_cmd field of
+ * Run a given controller command, as selected by the current_cmd field of
* <b>conn</b>.
*/
int
@@ -2533,13 +2533,13 @@ handle_control_command(control_connection_t *conn,
for (unsigned i = 0; i < N_CONTROL_COMMANDS; ++i) {
const control_cmd_def_t *def = &CONTROL_COMMANDS[i];
- if (!strcasecmp(conn->incoming_cmd, def->name)) {
+ if (!strcasecmp(conn->current_cmd, def->name)) {
return handle_single_control_command(def, conn, cmd_data_len, args);
}
}
connection_printf_to_buf(conn, "510 Unrecognized command \"%s\"\r\n",
- conn->incoming_cmd);
+ conn->current_cmd);
return 0;
}