From 39480c797851c8c70914153b403a282a02e7aebb Mon Sep 17 00:00:00 2001 From: Robert Ransom Date: Tue, 24 May 2011 22:20:12 -0700 Subject: Correct some outdated comments --- src/or/control.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/or/control.c b/src/or/control.c index 0dad1b9dfa..5d2d135428 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -606,12 +606,12 @@ send_control_event_string(uint16_t event, event_format_t which, } SMARTLIST_FOREACH_END(conn); } -/** Helper for send_control1_event and send_control1_event_extended: +/** Helper for send_control_event and control_event_status: * Send an event to all v1 controllers that are listening for code * event. The event's body is created by the printf-style format in * format, and other arguments as provided. * - * Currently the length of the message is limited to 1024 (including the + * Currently the length of the message is limited to 10064 (including the * ending \\r\\n\\0). */ static void send_control_event_impl(uint16_t event, event_format_t which, @@ -644,7 +644,7 @@ send_control_event_impl(uint16_t event, event_format_t which, * event. The event's body is created by the printf-style format in * format, and other arguments as provided. * - * Currently the length of the message is limited to 1024 (including the + * Currently the length of the message is limited to 10064 (including the * ending \\n\\r\\0. */ static void send_control_event(uint16_t event, event_format_t which, -- cgit v1.2.3-54-g00ecf From 68cd0a9abeab126b3d954f060d922fd71cb945f7 Mon Sep 17 00:00:00 2001 From: Robert Ransom Date: Wed, 15 Jun 2011 21:16:44 -0700 Subject: Make connection_printf_to_buf's behaviour sane --- changes/fix-connection_printf_to_buf | 10 ++++++++++ src/or/control.c | 29 +++++++++++------------------ 2 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 changes/fix-connection_printf_to_buf diff --git a/changes/fix-connection_printf_to_buf b/changes/fix-connection_printf_to_buf new file mode 100644 index 0000000000..b6fa0921e1 --- /dev/null +++ b/changes/fix-connection_printf_to_buf @@ -0,0 +1,10 @@ + * Code simplifications and refactoring: + + - Make connection_printf_to_buf's behaviour sane. Its callers + expect it to emit a CRLF iff the format string ends with CRLF; + it actually emits a CRLF iff (a) the format string ends with + 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. + diff --git a/src/or/control.c b/src/or/control.c index 5d2d135428..2308cd66f2 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -481,33 +481,26 @@ decode_escaped_string(const char *start, size_t in_len_max, } /** Acts like sprintf, but writes its formatted string to the end of - * conn-\>outbuf. The message may be truncated if it is too long, - * but it will always end with a CRLF sequence. - * - * Currently the length of the message is limited to 1024 (including the - * ending CR LF NUL ("\\r\\n\\0"). */ + * conn-\>outbuf. */ static void connection_printf_to_buf(control_connection_t *conn, const char *format, ...) { -#define CONNECTION_PRINTF_TO_BUF_BUFFERSIZE 1024 va_list ap; - char buf[CONNECTION_PRINTF_TO_BUF_BUFFERSIZE]; - int r; - size_t len; + char *buf = NULL; + int len; + va_start(ap,format); - r = tor_vsnprintf(buf, sizeof(buf), format, ap); + len = tor_vasprintf(&buf, format, ap); va_end(ap); - if (r<0) { + + if (len < 0) { log_warn(LD_BUG, "Unable to format string for controller."); return; } - len = strlen(buf); - if (fast_memcmp("\r\n\0", buf+len-2, 3)) { - buf[CONNECTION_PRINTF_TO_BUF_BUFFERSIZE-1] = '\0'; - buf[CONNECTION_PRINTF_TO_BUF_BUFFERSIZE-2] = '\n'; - buf[CONNECTION_PRINTF_TO_BUF_BUFFERSIZE-3] = '\r'; - } - connection_write_to_buf(buf, len, TO_CONN(conn)); + + connection_write_to_buf(buf, (size_t)len, TO_CONN(conn)); + + tor_free(buf); } /** Write all of the open control ports to ControlPortWriteToFile */ -- cgit v1.2.3-54-g00ecf From 70785f87bb47e481053719f2a514bf0598c62b2d Mon Sep 17 00:00:00 2001 From: Robert Ransom Date: Thu, 16 Jun 2011 02:57:58 -0700 Subject: Fix comment typo --- src/or/control.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/or/control.c b/src/or/control.c index 2308cd66f2..2170a9b94f 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -98,7 +98,7 @@ static int disable_log_messages = 0; static int authentication_cookie_is_set = 0; /** If authentication_cookie_is_set, a secret cookie that we've stored to disk * and which we're using to authenticate controllers. (If the controller can - * read it off disk, it has permission to connect. */ + * read it off disk, it has permission to connect.) */ static char authentication_cookie[AUTHENTICATION_COOKIE_LEN]; /** A sufficiently large size to record the last bootstrap phase string. */ -- cgit v1.2.3-54-g00ecf From 227896e447625b0718690d7228f1239a0fc399d1 Mon Sep 17 00:00:00 2001 From: Robert Ransom Date: Thu, 16 Jun 2011 03:39:37 -0700 Subject: Make send_control_event_impl's behaviour sane --- changes/fix-connection_printf_to_buf | 7 ++++++- src/or/control.c | 31 ++++++++----------------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/changes/fix-connection_printf_to_buf b/changes/fix-connection_printf_to_buf index b6fa0921e1..e191eac8a5 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 2170a9b94f..e7d204473e 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 * event. The event's body is created by the printf-style format in - * format, and other arguments as provided. - * - * Currently the length of the message is limited to 10064 (including the - * ending \\r\\n\\0). */ + * format, 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 * event. The event's body is created by the printf-style format in - * format, and other arguments as provided. - * - * Currently the length of the message is limited to 10064 (including the - * ending \\n\\r\\0. */ + * format, and other arguments as provided. */ static void send_control_event(uint16_t event, event_format_t which, const char *format, ...) -- cgit v1.2.3-54-g00ecf