aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ransom <rransom.8774@gmail.com>2011-06-16 03:39:37 -0700
committerNick Mathewson <nickm@torproject.org>2011-06-17 13:57:25 -0400
commit227896e447625b0718690d7228f1239a0fc399d1 (patch)
treefcaf875e6b921386705e3d89f940f9002a9b2f0d
parent70785f87bb47e481053719f2a514bf0598c62b2d (diff)
downloadtor-227896e447625b0718690d7228f1239a0fc399d1.tar
tor-227896e447625b0718690d7228f1239a0fc399d1.tar.gz
Make send_control_event_impl's behaviour sane
-rw-r--r--changes/fix-connection_printf_to_buf7
-rw-r--r--src/or/control.c31
2 files changed, 14 insertions, 24 deletions
diff --git a/changes/fix-connection_printf_to_buf b/changes/fix-connection_printf_to_buf
index b6fa0921e..e191eac8a 100644
--- a/changes/fix-connection_printf_to_buf
+++ b/changes/fix-connection_printf_to_buf
@@ -6,5 +6,10 @@
CRLF or (b) the resulting string is over 1023 characters long or
(c) the format string does not end with CRLF ''and'' the
resulting string is 1021 characters long or longer. Bugfix on
- 0.1.1.9-alpha; fixes bug 3407.
+ 0.1.1.9-alpha; fixes part of bug 3407.
+
+ - Make send_control_event_impl's behaviour sane. Its callers
+ expect it to always emit a CRLF at the end of the string; it
+ might emit extra control characters as well. Bugfix on
+ 0.1.1.9-alpha; fixes another part of bug 3407.
diff --git a/src/or/control.c b/src/or/control.c
index 2170a9b94..e7d204473 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -602,43 +602,28 @@ send_control_event_string(uint16_t event, event_format_t which,
/** Helper for send_control_event and control_event_status:
* Send an event to all v1 controllers that are listening for code
* <b>event</b>. The event's body is created by the printf-style format in
- * <b>format</b>, and other arguments as provided.
- *
- * Currently the length of the message is limited to 10064 (including the
- * ending \\r\\n\\0). */
+ * <b>format</b>, and other arguments as provided. */
static void
send_control_event_impl(uint16_t event, event_format_t which,
const char *format, va_list ap)
{
- /* This is just a little longer than the longest allowed log message */
-#define SEND_CONTROL1_EVENT_BUFFERSIZE 10064
- int r;
- char buf[SEND_CONTROL1_EVENT_BUFFERSIZE];
- size_t len;
+ char *buf = NULL;
+ int len;
- r = tor_vsnprintf(buf, sizeof(buf), format, ap);
- if (r<0) {
+ len = tor_vasprintf(&buf, format, ap);
+ if (len < 0) {
log_warn(LD_BUG, "Unable to format event for controller.");
return;
}
- len = strlen(buf);
- if (fast_memcmp("\r\n\0", buf+len-2, 3)) {
- /* if it is not properly terminated, do it now */
- buf[SEND_CONTROL1_EVENT_BUFFERSIZE-1] = '\0';
- buf[SEND_CONTROL1_EVENT_BUFFERSIZE-2] = '\n';
- buf[SEND_CONTROL1_EVENT_BUFFERSIZE-3] = '\r';
- }
-
send_control_event_string(event, which|ALL_FORMATS, buf);
+
+ tor_free(buf);
}
/** Send an event to all v1 controllers that are listening for code
* <b>event</b>. The event's body is created by the printf-style format in
- * <b>format</b>, and other arguments as provided.
- *
- * Currently the length of the message is limited to 10064 (including the
- * ending \\n\\r\\0. */
+ * <b>format</b>, and other arguments as provided. */
static void
send_control_event(uint16_t event, event_format_t which,
const char *format, ...)