summaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
Diffstat (limited to 'src/or')
-rw-r--r--src/or/dirserv.c13
-rw-r--r--src/or/dirvote.c10
-rw-r--r--src/or/or.h6
3 files changed, 15 insertions, 14 deletions
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index b9dc252b03..224554d155 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1868,6 +1868,7 @@ routerstatus_format_entry(char *buf, size_t buf_len,
if (first_line_only)
return 0;
cp = buf + strlen(buf);
+ /* NOTE: Whenever this list expands, be sure to increase MAX_FLAG_LINE_LEN*/
r = tor_snprintf(cp, buf_len - (cp-buf),
"s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
/* These must stay in alphabetical order. */
@@ -1890,7 +1891,9 @@ routerstatus_format_entry(char *buf, size_t buf_len,
}
cp += strlen(cp);
- if (version) {
+ /* length of "opt v \n" */
+#define V_LINE_OVERHEAD 7
+ if (version && strlen(version) < MAX_V_LINE_LEN - V_LINE_OVERHEAD) {
if (tor_snprintf(cp, buf_len - (cp-buf), "opt v %s\n", version)<0) {
log_warn(LD_BUG, "Unable to print router version.");
return -1;
@@ -2280,17 +2283,15 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
static cached_dir_t *
generate_v2_networkstatus_opinion(void)
{
-/** Longest status flag name that we generate. */
-#define LONGEST_STATUS_FLAG_NAME_LEN 9
-/** Maximum number of status flags we'll apply to one router. */
-#define N_STATUS_FLAGS 10
/** Amount of space to allocate for each entry. (r line and s line.) */
#define RS_ENTRY_LEN \
( /* first line */ \
MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+ \
5*2 /* ports */ + 10 /* punctuation */ + \
/* second line */ \
- (LONGEST_STATUS_FLAG_NAME_LEN+1)*N_STATUS_FLAGS + 2)
+ (MAX_FLAG_LINE_LEN) + \
+ /* third line */ \
+ (MAX_V_LINE_LEN))
cached_dir_t *r = NULL;
size_t len, identity_pkey_len;
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index ec985b19cc..a9de115683 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -36,19 +36,15 @@ char *
format_networkstatus_vote(crypto_pk_env_t *private_signing_key,
networkstatus_t *v3_ns)
{
-/** Longest status flag name that we generate. */
-#define LONGEST_STATUS_FLAG_NAME_LEN 9
-/** Maximum number of status flags we'll apply to one router. */
-#define N_STATUS_FLAGS 10
/** Amount of space to allocate for each entry: r, s, and v lines. */
#define RS_ENTRY_LEN \
( /* first line */ \
MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+ \
5*2 /* ports */ + 10 /* punctuation */ + \
/* second line */ \
- (LONGEST_STATUS_FLAG_NAME_LEN+1)*N_STATUS_FLAGS + 2 + \
- /* v line. XXXX020 not accurate! */ \
- 80 \
+ MAX_FLAG_LINE_LEN + \
+ /* v line. */ \
+ MAX_V_LINE_LEN \
)
size_t len;
diff --git a/src/or/or.h b/src/or/or.h
index 448df3645a..a1aea43901 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3049,7 +3049,11 @@ download_status_is_ready(download_status_t *dls, time_t now,
}
/********************************* dirserv.c ***************************/
-
+/** Maximum allowable length of a version line in a networkstatus. */
+#define MAX_V_LINE_LEN 128
+/** Length of "r Authority BadDirectory BadExit Exit Fast Guard HSDir Named
+ * Running Stable Unnamed V2Dir Valid\n". */
+#define MAX_FLAG_LINE_LEN 96
#define UNNAMED_ROUTER_NICKNAME "Unnamed"
int connection_dirserv_flushed_some(dir_connection_t *conn);