From 0a58bbe0dd6bbcde883e560dab4aad4282aee08b Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 23 Nov 2004 00:11:36 +0000 Subject: Fix critical bug in circuit_list_path: cpath is a circular list! (Also reimplement circuit_log_cpath using circuit_list_cpath). svn:r2946 --- src/or/circuitbuild.c | 55 ++++++++++++++++++++++++++++++++++++++------------- src/or/control.c | 2 +- src/or/or.h | 2 +- 3 files changed, 43 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 9b5c83431..bf2c2b859 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -61,36 +61,57 @@ static uint16_t get_unique_circ_id_by_conn(connection_t *conn) { return test_circ_id; } -/** Allocate and return a comma-separated list of the currently built - * elements of circuit_t. +/** If verbose is false, allocate and return a comma-separated + * list of the currently built elements of circuit_t. If + * verbose is true, also list information about link status in + * a more verbose format using spaces. */ -char *circuit_list_path(circuit_t *circ) +char * +circuit_list_path(circuit_t *circ, int verbose) { struct crypt_path_t *hop; - routerinfo_t *r; smartlist_t *elements; + const char *states[] = {"closed", "waiting for keys", "open"}; + char buf[128]; char *s; tor_assert(CIRCUIT_IS_ORIGIN(circ)); tor_assert(circ->cpath); elements = smartlist_create(); - for (hop = circ->cpath; hop; hop = hop->next) { - if (hop->state != CPATH_STATE_OPEN) + if (verbose) { + tor_snprintf(buf, sizeof(buf)-1, "circ (length %d, exit %s):", + circ->build_state->desired_path_len, + circ->build_state->chosen_exit_name); + smartlist_add(elements, tor_strdup(buf)); + } + + for (hop = circ->cpath; hop && hop != circ->cpath; hop = hop->next) { + const char *elt; + routerinfo_t *r; + if (!verbose && hop->state != CPATH_STATE_OPEN) break; if ((r = router_get_by_digest(hop->identity_digest))) { - smartlist_add(elements, tor_strdup(r->nickname)); + elt = r->nickname; } else if (circ->purpose == CIRCUIT_PURPOSE_C_REND_JOINED) { - smartlist_add(elements, tor_strdup("")); + elt = ""; } else { - s = tor_malloc(HEX_DIGEST_LEN+2); - s[0]='$'; - base16_encode(s+1,HEX_DIGEST_LEN+1,hop->identity_digest,DIGEST_LEN); - smartlist_add(elements, s); + buf[0]='$'; + base16_encode(buf+1,sizeof(buf)-1,hop->identity_digest,DIGEST_LEN); + elt = buf; + } + if (verbose) { + size_t len = strlen(elt)+2+strlen(states[hop->state])+1; + char *v = tor_malloc(len); + tor_assert(hop->state <= 2); + tor_snprintf(v,len,"%s(%s)",elt,states[hop->state]); + smartlist_add(elements, v); + } else { + smartlist_add(elements, tor_strdup(elt)); } } - s = smartlist_join_strings(elements, ",", 0, NULL); + s = smartlist_join_strings(elements, verbose?" ":",", 0, NULL); SMARTLIST_FOREACH(elements, char*, cp, tor_free(cp)); return s; } @@ -100,6 +121,11 @@ char *circuit_list_path(circuit_t *circ) * exit point. */ void circuit_log_path(int severity, circuit_t *circ) { +#if 1 + char *s = circuit_list_path(circ,1); + log_fn(severity,"%s",s); + tor_free(s); +#else char buf[1024]; char *s = buf; struct crypt_path_t *hop; @@ -127,6 +153,7 @@ void circuit_log_path(int severity, circuit_t *circ) { hop=hop->next; } while(hop!=circ->cpath); log_fn(severity,"%s",buf); +#endif } /** Tell the rep(utation)hist(ory) module about the status of the links @@ -631,7 +658,7 @@ int circuit_finish_handshake(circuit_t *circ, char *reply) { } hop->state = CPATH_STATE_OPEN; - log_fn(LOG_INFO,"finished"); + log_fn(LOG_INFO,"Finished building circuit:"); circuit_log_path(LOG_INFO,circ); control_event_circuit_status(circ, CIRC_EVENT_EXTENDED); diff --git a/src/or/control.c b/src/or/control.c index 92297f350..33144a78c 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -492,7 +492,7 @@ control_event_circuit_status(circuit_t *circ, circuit_status_event_t tp) tor_assert(circ); tor_assert(CIRCUIT_IS_ORIGIN(circ)); - path = circuit_list_path(circ); + path = circuit_list_path(circ,0); path_len = strlen(path); msg = tor_malloc(1+4+path_len+1); /* event, circid, path, NUL. */ msg[0] = (uint8_t) tp; diff --git a/src/or/or.h b/src/or/or.h index 3965f1b1b..7039885c7 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1032,7 +1032,7 @@ void assert_buf_ok(buf_t *buf); /********************************* circuitbuild.c **********************/ -char *circuit_list_path(circuit_t *circ); +char *circuit_list_path(circuit_t *circ, int verbose); void circuit_log_path(int severity, circuit_t *circ); void circuit_rep_hist_note_result(circuit_t *circ); void circuit_dump_by_conn(connection_t *conn, int severity); -- cgit v1.2.3