summaryrefslogtreecommitdiff
path: root/src/or/control.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-02-05 21:39:49 +0000
committerNick Mathewson <nickm@torproject.org>2008-02-05 21:39:49 +0000
commitfac2cd3b03379f68f0256d28658b03d1b2b38194 (patch)
treee90f969f382862fc522c9c272c0f46f2b84b0574 /src/or/control.c
parentcf6fe27616603d9b7839cb91dbdb71fa0a766a44 (diff)
downloadtor-fac2cd3b03379f68f0256d28658b03d1b2b38194.tar.gz
tor-fac2cd3b03379f68f0256d28658b03d1b2b38194.zip
r17916@catbus: nickm | 2008-02-05 16:29:35 -0500
Fix some XXX020 items in control.c: add a maximum line length and note that the number of versioning authorities is no longer apparent to clients. svn:r13390
Diffstat (limited to 'src/or/control.c')
-rw-r--r--src/or/control.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/or/control.c b/src/or/control.c
index afb88d2a9b..318da73e8c 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -1640,8 +1640,7 @@ getinfo_helper_events(control_connection_t *control_conn,
smartlist_free(status);
} else if (!strcmpstart(question, "addr-mappings/") ||
!strcmpstart(question, "address-mappings/")) {
- /* XXXX020 Warn about deprecated addr-mappings variant? Or wait for
- * 0.2.1.x? */
+ /* XXXX021 Warn about deprecated addr-mappings variant. */
time_t min_e, max_e;
smartlist_t *mappings;
int want_expiry = !strcmpstart(question, "address-mappings/");
@@ -1712,10 +1711,11 @@ getinfo_helper_events(control_connection_t *control_conn,
}
} else if (!strcmp(question, "status/version/num-versioning") ||
!strcmp(question, "status/version/num-concurring")) {
- /*XXXX020 deprecate.*/
char s[33];
tor_snprintf(s, sizeof(s), "%d", get_n_authorities(V3_AUTHORITY));
*answer = tor_strdup(s);
+ log_warn(LD_GENERAL, "%s is deprecated; it no longer gives useful "
+ "information");
}
} else {
return 0;
@@ -2627,6 +2627,11 @@ is_valid_initial_command(control_connection_t *conn, const char *cmd)
return 0;
}
+/** Do not accept any control command of more than 1MB in length. Anything
+ * that needs to be anywhere near this long probably means that one of our
+ * interfaces is broken. */
+#define MAX_COMMAND_LINE_LENGTH (1024*1024)
+
/** Called when data has arrived on a v1 control connection: Try to fetch
* commands from conn->inbuf, and execute them.
*/
@@ -2679,7 +2684,12 @@ connection_control_process_inbuf(control_connection_t *conn)
/* Line not all here yet. Wait. */
return 0;
else if (r == -1) {
- /*XXXX020 impose some maximum on length! */
+ if (data_len + conn->incoming_cmd_cur_len > MAX_COMMAND_LINE_LENGTH) {
+ connection_write_str_to_buf("500 Line too long.\r\n", TO_CONN(conn));
+ connection_stop_reading(TO_CONN(conn));
+ connection_mark_for_close(TO_CONN(conn));
+ conn->_base.hold_open_until_flushed = 1;
+ }
while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len)
conn->incoming_cmd_len *= 2;
conn->incoming_cmd = tor_realloc(conn->incoming_cmd,